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

时间:2013-11-21 05:34:38

标签: php excel csv

我有一个90MB的大型xlsx文件使用phpexcel它给了我

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

我尝试使用记录here的每个方法加载文件,并且还更改了php.ini memory_limit = -1

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

有没有办法在不使用phpexcel的情况下将xlsx文件转换为csv?

4 个答案:

答案 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)

您可以使用执行此操作;使用以下内容,您将扫描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