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


Convert large xlsx file to csv without using phpExcel

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

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

我尝试使用这里记录的每种方法加载该文件,还更改了php.ini memory_limit = -1

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

有没有任何方法可以在不使用phpexcel的情况下将xlsx文件转换为csv?

您可以使用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)])

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具有的每行(row标记)的每个单元格(c标签):

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

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

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

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

3路教程:

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

希望这能帮助。。。

您可以使用excel vba来完成此操作;通过以下操作,您将扫描A1->A10并导出当前工作簿"DATA"选项卡的前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