преобразование файла Excel (xls) в файл с разделителями-запятыми (csv) без графического интерфейса - PullRequest
21 голосов
/ 03 июня 2009

Есть ли простой способ перевести XLS в файл в формате CSV без запуска оконного приложения Excel?

Мне нужно обработать некоторые книги Excel XLS со скриптами. Для этого мне нужно преобразовать файл XLS в файл CSV. Это можно сделать с помощью сохранения из приложения Excel. Но я хотел бы автоматизировать это (поэтому не открывайте окно приложения Excel).

Достаточно, если первый лист из рабочей книги будет переведен в формат CSV. Мне нужно просто обработать данные на этом листе.

В моей системе установлены Cygwin и Excel - если это поможет.

Редактировать: Хорошо, у меня есть рабочее решение с Perl. Обновление для будущего использования другими пользователями.

Я установил модуль Spreadsheet :: ParseExcel . а затем использовал read-excel.pl образец.

Мой код представляет собой небольшое изменение этого примера кода, как показано ниже.

#!/usr/bin/perl -w
# For each tab (worksheet) in a file (workbook),
# spit out columns separated by ",",
# and rows separated by c/r.

use Spreadsheet::ParseExcel;
use strict;

my $filename = shift || "Book1.xls";
my $e = new Spreadsheet::ParseExcel;
my $eBook = $e->Parse($filename);
my $sheets = $eBook->{SheetCount};
my ($eSheet, $sheetName);

foreach my $sheet (0 .. $sheets - 1) {
    $eSheet = $eBook->{Worksheet}[$sheet];
    $sheetName = $eSheet->{Name};
    print "#Worksheet $sheet: $sheetName\n";
    next unless (exists ($eSheet->{MaxRow}) and (exists ($eSheet->{MaxCol})));
    foreach my $row ($eSheet->{MinRow} .. $eSheet->{MaxRow}) {
        foreach my $column ($eSheet->{MinCol} .. $eSheet->{MaxCol}) {
            if (defined $eSheet->{Cells}[$row][$column])
            {
                print $eSheet->{Cells}[$row][$column]->Value . ",";
            } else {
                print ",";
            }
        }
        print "\n";
    }
}

Обновление : Вот сценарий Powershell, с которым также может быть легко работать; как есть с этого блога MSDN и SO Reference .

$excel = New-Object -comobject Excel.Application
$workbooks = $excel.Workbooks.Open("C:\test.xlsx")
$worksheets = $workbooks.Worksheets
$worksheet = $worksheets.Item(1)
$range = $worksheet.UsedRange
foreach($row in $range.Rows)
{
    foreach($col in $row.Columns)
    {
        echo $col.Text
    }
}

Обновление: я недавно столкнулся с инструментом Windows CSVed на этот ответ суперпользователя , который может быть полезен для некоторых людей.

Ответы [ 13 ]

6 голосов
/ 13 октября 2009

Вы можете использовать xls2csv из пакета catdoc, если вы используете Debian / Ubuntu

4 голосов
/ 03 октября 2011

С Гнездовые документы :

Gnumeric может конвертировать файлы автоматически без вмешательства пользователя. Это позволяет конвертировать большое количество файлов с помощью скрипта. Gnumeric распространяется вместе с программой ssconvert, которая используется для автоматического преобразования файлов. Можно использовать все форматы файлов, поддерживаемые Gnumeric, за исключением форматов файлов Postscript и PDF, которые работают через систему печати. ​​

Это приложение используется из командной строки путем указания любых желаемых параметров, входного файла и выходного файла. Например,

ssconvert myfile.xls myfile.gnumeric

конвертирует файл формата Excel в файл формата Gnumeric.

Доступные форматы файлов импорта и экспорта, которые может прочитать ssconvert, могут быть перечислены с помощью

ssconvert --list-importers

или

ssconvert --list-exporters

соответственно.

Как и другие приложения командной строки GNU, ssconvert содержит страницу руководства. Эту страницу можно открыть, набрав:

man ssconvert

, который откроет страницу руководства. На этой странице можно перемещаться, нажимая клавишу пробела или используя кнопки Page Up и Page Down. Программу man можно закрыть, набрав клавишу q.

Я им пользуюсь и хорошо работает.

4 голосов
/ 03 июня 2009

В мире Java вы можете использовать apache poi. Вы можете начать со следующего фрагмента Groovy.

FileInputStream fis = new FileInputStream(filename);
Workbook wb = new HSSFWorkbook(fis); 
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
  for (Cell cell : row) {
    doSomething(cell.toString())
  }

}
3 голосов
/ 03 июня 2009

Используйте Perl-скрипт. Использование perl-модуля Spreadsheet :: ParseExcel из CPAN для анализа файла xls с последующим выводом, так как csv должен работать нормально.

http://search.cpan.org/dist/Spreadsheet-ParseExcel

Вы также можете попробовать использовать VBScript.

2 голосов
/ 03 июня 2009

Excel можно использовать в качестве источника данных, и есть драйверы для доступа к EXCEL в качестве базы данных.

1.) Создайте и откройте соединение с файлом EXCEL, который вы хотите преобразовать в CSV.

2.) Запустите запрос типа «SELECT * From Sheet1», который загрузит все данные Sheet1 в набор записей или данных.

3.) Поскольку я использую .net, я могу хранить эти записи в datatable и конвертировать в CSV, используя следующий метод расширения.

        public static string ToCSV(this DataTable _dataTable)
        {
            StringBuilder csv = new StringBuilder();
            StringWriter sw = new StringWriter(csv);
            int icolcount = _dataTable.Columns.Count;
            for (int i = 0; i < icolcount; i++)
            {
                sw.Write(_dataTable.Columns[i]);
                if (i < icolcount - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);
            foreach (DataRow drow in _dataTable.Rows)
            {
                for (int i = 0; i < icolcount; i++)
                {
                    if (!Convert.IsDBNull(drow[i]))
                    {
                        sw.Write(drow[i].ToString());
                    }
                    if (i < icolcount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
            return csv.ToString();
        }

Вы можете применить этот подход на платформа, на которой вы работаете.

Спасибо.

2 голосов
/ 03 июня 2009

Используйте одну из переносимых библиотек [Python]:

pyxlreader.sourceforge.net /

sourceFORGE.net / проекты / pyexcelerator

и создайте дополнительный слой скрипта поверх него.

1 голос
/ 01 июня 2011

VBS скрипт и он работает потрясающе http://www.go4expert.com/forums/showthread.php?t=18188

Set objArgs = WScript.Arguments Для I = 0 до objArgs.Count - 1

FullName = objArgs(I)
FileName = Left(objArgs(I), InstrRev(objArgs(I), ".") )

Set objExcel = CreateObject("Excel.application")
set objExcelBook = objExcel.Workbooks.Open(FullName)

objExcel.application.visible=false
objExcel.application.displayalerts=false

objExcelBook.SaveAs FileName & "csv", 23

objExcel.Application.Quit
objExcel.Quit   

Set objExcel = Nothing
set objExcelBook = Nothing

Далее

0 голосов
/ 21 декабря 2014

Вы можете сделать это с помощью Alacon - утилиты командной строки для Alasql базы данных.

Он работает с Node.js, поэтому вам нужно установить Node.js , а затем Alasql пакет:

> npm install alasql

Чтобы преобразовать файл Excel в CVS (ot TSV), введите:

> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"

Alacon поддерживает преобразования других типов (CSV, TSV, TXT, XLSX, XLS) и языковые конструкции SQL (см. Руководство пользователя для примеров).

0 голосов
/ 31 января 2014

мое решение:

use Spreadsheet::BasicRead;

my $xls = 'file.xls';   
my $csv = 'file.csv';

   my $ss = new Spreadsheet::BasicRead($xls) or die "Could not open '$xls': $!";
   my $name = '';
   my $row = 0;

   open(FILE, ">$csv") or die "Could not open : $!\n";
      flock(FILE, 2) or die "Could not lock file\n"; 

        while (my $data = $ss->getNextRow()){
            $row++;
            $name = join(';',@$data);         
            print FILE $name."\n" if ($name ne "");
        }

      flock(FILE, 8); 
   close FILE; 
0 голосов
/ 27 июня 2009

Я довольно новичок в этих форумах, и было бы неплохо, если бы они ставили год на отметках времени (любимая мозоль), чтобы я знал, сколько лет постам. Я собираюсь предположить, что они с 2009 года.

но хорошее решение в python - использовать xlrd для чтения в ваших файлах xls. вот довольно простое вступительное руководство: http://scienceoss.com/read-excel-files-from-python/ это не мое.

единственная проблема, с которой я столкнулся - это превосходные свидания. вот быстрое решение для них:

date = xlrd.xldate_as_tuple (int (sheet.cell (rowNum, colNum) .value), workBookName.datemode)

, чем создать CSV-файл с помощью встроенного CSV-модуля, так как я являюсь новым пользователем и могу опубликовать только одну гиперссылку. но Google API модуля CSV.

надеюсь, что это было полезно

...