Преобразование файла Excel (xls) в файл с разделителями-запятыми (csv) без GUI
Есть ли простой способ перевести XLS в файл в формате CSV без запуска оконного приложения Excel?
Мне нужно обработать некоторые книги Excel XLS со сценариями. Для этого мне нужно преобразовать файл xls в файл csv. Это можно сделать с помощью save-as из приложения 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 script, с которым может быть легко работать;
as-is from этот блог MSDN и ссылку SO.
$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 на Ответ суперпользователя, который может быть полезен для некоторых людей.
Ответы
Ответ 1
Используйте perl script. Использование модуля Spreadsheet:: ParseExcel perl из CPAN для анализа файла xls, за которым следует вывод, поскольку csv должен работать нормально.
http://search.cpan.org/dist/Spreadsheet-ParseExcel
Вы также можете попробовать использовать VBScript.
Ответ 2
Вы можете использовать xls2csv из пакета catdoc, если вы используете Debian/Ubuntu
Ответ 3
В мире 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())
}
}
Ответ 4
Из Gnumeric docs:
Gnumeric может автоматически конвертировать файлы без вмешательства пользователя. Это позволяет преобразовать большое количество файлов с помощью script. Gnumeric распространяется вместе с программой под названием ssconvert
, которая является программой, используемой для автоматического преобразования файлов. Все форматы файлов, поддерживаемые Gnumeric, могут использоваться, кроме форматов файлов Postscript и PDF, которые работают через систему печати.
Это приложение используется из командной строки, указывая любые желаемые параметры, входной файл и выходной файл. Например,
ssconvert myfile.xls myfile.gnumeric
преобразует файл формата Excel в файл формата Gnumeric.
Доступные форматы файлов импорта и экспорта, которые ssconvert может читать, могут быть перечислены с помощью
ssconvert --list-importers
или
ssconvert --list-exporters
соответственно.
Как и другие приложения командной строки GNU, ssconvert включает страницу руководства. Доступ к этой странице можно получить, набрав:
man ssconvert
который откроет страницу руководства. Эту страницу можно перемещать, введя пробел или используя кнопки "вверх" и "вниз". Программа man может быть уволена, набрав ключ q.
Я использую его и хорошо работаю.
Ответ 5
Используйте одну из портативных библиотек [Python]:
pyxlreader.sourceforge.net/
sourceforge.net/projects/pyexcelerator
и добавьте над ним слой script.
Ответ 6
Excel можно использовать как источник данных, и есть доступные драйверы для доступа к базе данных EXCEL.
1.) Создайте и откройте подключение к файлу EXCEL, который вы хотите преобразовать в CSV.
2.) Выполните запрос типа "SELECT * From Sheet1", который загрузит все данные Sheet1 в набор записей или datatable.
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();
}
Вы можете применить этот подход на платформу, над которой вы работаете.
Спасибо.
Ответ 7
VBS script, и он работает потрясающе
http://www.go4expert.com/forums/showthread.php?t=18188
Установить objArgs = WScript.Arguments
Для я = 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
Далее
Ответ 8
Рекомендовать конвертировать XLS:
http://www.softinterface.com/Convert-XLS%5CConvert-XLS.htm
'Convert XLS - простая в использовании, но сложная утилита Excel-конвертера, специально разработанная для файлов Excel, текстовых и CSV файлов (с символами и запятыми). Если вам нужно преобразовать/управлять одним или несколькими тысячами файлов, расположенных в одной или нескольких папках, это инструмент! Конверсии можно сделать в 10-15 раз быстрее без MS Excel.
Автоматизация задач преобразования Excel с помощью:
- Встроенный планировщик
- Командная строка
- интерфейс COM-интерфейса
Ответ 9
Если у вас есть Cygwin, скорее всего у вас будет Python. Если нет - установите python и используйте script. Это намного больше, чем нужно, но конвертируется легко и быстро.
Ответ 10
@Джон Мачин:
Я не могу добавить комментарий, поскольку я новичок для этого форума:)
Я не использовал старый пакет pyXLreader, но создаю сообщение с xlrd;)
Я видел это месяц назад, но не использовался в проектах.
WBR
Ответ 11
iam довольно новичок в этих форумах, и было бы неплохо, если бы они поставили год на отметки времени (pet peeve), поэтому я знаю, сколько лет сообщений. iam собирается предположить, что они с 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 модуль csv api.
надеюсь, что это было полезно
Ответ 12
мое решение:
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;
Ответ 13
Вы можете сделать это с помощью утилиты командной строки Alacon для Alasql.
Он работает с Node.js, поэтому вам нужно установить Node.js, а затем Alasql:
> npm install alasql
Чтобы преобразовать файл Excel в CVS (от TSV), вы можете ввести:
> node alacon "SELECT * INTO CSV('mydata.csv', {headers:true}) FROM XLS('mydata.xls', {headers:true})"
Alacon поддерживает преобразования типа другого типа (CSV, TSV, TXT, XLSX, XLS) и SQL (см. Руководство пользователя).