我有一个90MB
的大型xlsx文件使用phpexcel
它给了我
Warning: simplexml_load_string(): Memory allocation failed : growing buffer
我尝试使用记录here的每个方法加载文件,并且还更改了php.ini memory_limit = -1
。
我正在尝试将xlsx文件转换为csv文件,以便可以轻松加载。
有没有办法在不使用phpexcel的情况下将xlsx文件转换为csv?
答案 0 :(得分:3)
您可以使用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)])
答案 1 :(得分:2)
XLSX文件是压缩的zip文件。如果解压缩XLSX文件,请查看文件夹 xl / worksheets ,其中包含文件每张表的xml文件。
您可能希望首先提取这些XML文件,然后逐个元素地解析(xml)内容,以便获取每个xml元素的缓冲区不需要那么大。这样,您可以在php中创建自己的脚本来读取提取的文件,或使用一些xml解析器将工作表转换为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">
<c r="B1" s="1" t="s"><v>0</v></c>
<c r="C1" s="1" t="s"><v>1</v></c>
<c r="D1" s="1" t="s"><v>2</v></c>
</row>
<row r="2" spans="1:10" x14ac:dyDescent="0.2">
<c r="A2" s="1" t="s"><v>4</v></c><c r="B2" s="1"><v>200</v></c>
<c r="C2" s="1"><v>200</v></c>
<c r="D2" s="1"><v>100</v></c><c r="E2" s="1"><v>200</v></c>
</row>
<row r="3" spans="1:10" x14ac:dyDescent="0.2">
<c r="A3" s="1" t="s"><v>10</v></c><c r="C3" s="1"><f>6*125</f><v>750</v></c>
<c r="H3" s="1" t="s"><v>6</v></c><c r="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>
也就是说,您需要查看xml具有的每一行( c 标记)的每个单元格( c 标记):
worksheet.sheetData.row[i].c[j].v
并获取值的内容( v 标记)。
答案 2 :(得分:1)
最大100MB文件大小的在线转换器:
http://www.zamzar.com/convert/xlsx-to-csv/
3路教程:
http://www.ehow.com/how_6921725_convert-xlsx-file-csv.html
希望这会有所帮助...
答案 3 :(得分:0)
您可以使用excel-vba执行此操作;使用以下内容,您将扫描A1 - &gt; A10并输出&#34; DATA&#34;的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