[英]Is there any way to write xlsx file without using any phpexcel library like csv or xml file
[英]Convert large xlsx file to csv without using phpExcel
我有一个大的xlsx文件,使用phpexcel
给我90MB
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具有的每一行( 行标记)的每个单元格( 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.