不使用phpExcel将大的xlsx文件转换为csv

我有一个大的xlsx文件,使用phpexcel90MB它给了我

 Warning: simplexml_load_string(): Memory allocation failed : growing buffer 

我尝试使用这里logging的每种方法加载文件,并且还改变了php.ini memory_limit = -1

我正在尝试将xlsx文件转换为csv文件,以便可以轻松加载。

有没有办法将xlsx文件转换为csv而不使用phpexcel?

你可以使用python :

 wb = xlrd.open_workbook(os.path.join(filepath, 'result.xls')) sheet = wb.sheet_by_index(0) fp = open(os.path.join(filepath, 'result.csv'), 'wb') wr = csv.writer(fp, quoting=csv.QUOTE_ALL) for rownum in xrange(sheet.nrows): wr.writerow([unicode(val).encode('utf8') for val in sheet.row_values(rownum)]) 

在线转换器最大100MB文件大小:

http://www.zamzar.com/convert/xlsx-to-csv/

3种方法的教程:

http://www.ehow.com/how_6921725_convert-xlsx-file-csv.html

希望这可以帮助…

XLSX文件是压缩的zip文件。 如果您解压缩XLSX文件,请查看xl / worksheets文件夹,其中包含每个文件的xml文件。

您可能需要首先解压缩这些XML文件,然后逐个parsing(xml)内容,以便获取每个xml元素的缓冲区不需要那么大。 这样,你可以在PHP中创build你自己的脚本来读取解压缩的文件,或者使用一些XMLparsing器将表单转换为xml对象,然后转储你的csv。

生成的xml的结构就像这个例子(重要的信息在sheetData里面):

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"> <dimension ref="A1:J42"/> <sheetViews> <sheetView workbookViewId="0"> <selection activeCell="C7" sqref="C7"/> </sheetView> </sheetViews> <sheetFormatPr defaultRowHeight="12.75" x14ac:dyDescent="0.2"/> <cols> <col min="1" max="1" width="18.140625" style="1" customWidth="1"/> <col min="2" max="16384" width="9.140625" style="1"/> </cols> <sheetData> <row r="1" spans="1:10" x14ac:dyDescent="0.2"> <cr="B1" s="1" t="s"><v>0</v></c> <cr="C1" s="1" t="s"><v>1</v></c> <cr="D1" s="1" t="s"><v>2</v></c> </row> <row r="2" spans="1:10" x14ac:dyDescent="0.2"> <cr="A2" s="1" t="s"><v>4</v></c><cr="B2" s="1"><v>200</v></c> <cr="C2" s="1"><v>200</v></c> <cr="D2" s="1"><v>100</v></c><cr="E2" s="1"><v>200</v></c> </row> <row r="3" spans="1:10" x14ac:dyDescent="0.2"> <cr="A3" s="1" t="s"><v>10</v></c><cr="C3" s="1"><f>6*125</f><v>750</v></c> <cr="H3" s="1" t="s"><v>6</v></c><cr="I3" s="1"><v>130</v></c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> <pageSetup paperSize="0" orientation="portrait" horizontalDpi="0" verticalDpi="0" copies="0"/> </worksheet> 

也就是说,您需要查看每个行( 标记)的每个单元格( c标记)xml有:

 worksheet.sheetData.row[i].c[j].v 

并取值( v标签)的内容。

你可以用excel-vba来做到这一点; 在下面,您将扫描A1 – > A10并导出当前工作簿的“数据”选项卡的5个第一列。

 Sub exportCSV() Dim wkRange As Range Dim cpSheet As Worksheet Dim myPath As String, myFileName As String Dim fn As Integer ' File number Dim cLine As String ' current line to be writen to file ' create output file: myPath = "C:\local\" myFileName = "out.csv" fn = FreeFile Open myPath & myFileName For Append As #fn Set wkRange = ThisWorkbook.Sheets("DATA").Range("$A1:$A10") For Each c In wkRange ' select your columns with "offset" cLine = c.Offset(0, 0).Value & "," cLine = cLine & c.Offset(0, 1).Value & "," cLine = cLine & c.Offset(0, 2).Value & "," cLine = cLine & c.Offset(0, 3).Value & "," cLine = cLine & c.Offset(0, 4).Value Print #fn, cLine Next Close #fn MsgBox "done!" End Sub