2013-11-21 8 views
9

У меня есть большой XLSX файл, который 90MB с помощью phpexcel это дает мнеПреобразование большого XLSX файл в формат CSV без использования PHPExcel

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

Я пытался загрузить файл, используя все методы документированных here, а также изменил PHP .ini memory_limit = -1.

Я пытаюсь преобразовать файл xlsx в файл csv, чтобы его можно было легко загрузить.

Есть ли способ конвертировать xlsx-файл в csv без использования phpexcel?

+0

Его огромный файл, вы можете использовать сам Office Excel для сохранения файла как csv, если его единственный файл – Saqueib

+0

Я хочу написать сценарий для загрузки этого файла и поместить его в базу данных mysql. – snehal

+0

90MB - это много, вы можете разделить этот файл по частям таким образом, что вы можете использовать PHPExcel - это способ пойти – Saqueib

ответ

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)]) 
+0

У меня нет знаний о python. не могли бы вы рассказать мне, как это сделать, используя php. – snehal

0

Вы можете сделать это с помощью ; с приведенным ниже, вы сканируете A1 -> A10 и экспортируете 5 первых столбцов вкладки «DATA» текущей книги.

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 
+0

Как запустить скрипт DBA без открытия Excel? – cytsunny

+0

(его vba, а не сценарий DBA); вы можете искать и находить его действительно невозможным: https://search.lilo.org/searchweb.php?q=run%20excel-vba%20macro%20without%20opening%20excel> http://stackoverflow.com/questions/12759229/running-macros-without-opening-excel –

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-есть:

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

и принять содержание значения (v тег).

+0

Не лучший ответ в моем воображении, но, по крайней мере, это дает некоторые подсказки в решении проблемы, читая строки за строкой. Разбор XML-содержимого для моего случая невозможен, так как даже для всего ОЗУ на моем компьютере недостаточно для открытия файла, поэтому чтение в виде строки с использованием PHP и последующий синтаксический разбор невозможны. – cytsunny

+1

Может существовать гибридный подход: вы определяете начало листовых данных с помощью чтения символов и затем анализируете один элемент строки путем чтения, пока он не достигнет конца. Я знаю, что есть java-синтаксические анализаторы xml, которые могут читать один тег по времени, поэтому я думаю, что может быть и аналоговый парсер для PHP. –

Смежные вопросы