在没有GUI的情况下将Excel(xls)文件转换为逗号分隔(csv)文件

时间:2009-06-03 05:12:40

标签: excel scripting csv

是否有一种简单的方法可以在不启动Excel窗口应用程序的情况下将XLS转换为CSV格式的文件?

我需要使用脚本处理一些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脚本,可能也很容易使用; 来自this MSDN blog and, 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
    }
}

更新:我最近在此CSVed遇到了一个Windows工具Superuser answer,这可能对某些人有用。

13 个答案:

答案 0 :(得分:6)

如果您使用的是Debian / Ubuntu,可以使用catdoc软件包中的xls2csv

答案 1 :(得分:4)

在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())
  }

}

答案 2 :(得分:4)

来自Gnumeric docs

  

Gnumeric可以自动转换文件而无需用户干预。这允许使用脚本转换大量文件。 Gnumeric与一个名为ssconvert的程序一起分发,该程序用于自动转换文件。除了通过打印系统运行的Postscript和PDF文件格式外,可以使用Gnumeric支持的所有文件格式。

     

通过指定命令行,可以使用此应用程序,任何所需的选项,输入文件和输出文件。例如,

ssconvert myfile.xls myfile.gnumeric
     

会将Excel格式文件转换为Gnumeric格式文件。

     

可以使用

列出ssconvert可以读取的可用导入和导出文件格式
ssconvert --list-importers
     

ssconvert --list-exporters
     

分别

     

与其他GNU命令行应用程序一样,ssconvert包含一个手册页。键入以下命令可访问此页面:

man ssconvert
     

将打开手册页。可以通过键入空格键或使用Page Up和Page Down按钮来导航此页面。通过输入q键可以解除man程序。

我正在使用它并且效果很好。

答案 3 :(得分:3)

使用perl脚本。使用CPAN中的Spreadsheet :: ParseExcel perl模块解析xls文件,然后输出为csv应该可以正常工作。

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

您也可以尝试使用VBScript。

答案 4 :(得分:2)

使用一个可移植的[Python]库:

pyxlreader.sourceforge.net /

sourceforge.net/projects/pyexcelerator

并在其上添加额外的脚本层。

答案 5 :(得分:2)

Excel可以用作数据源,并且有可用于访问EXCEL作为数据库的驱动程序。

1。)创建并打开与要转换为CSV的EXCEL文件的连接。

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();
        }
  

您可以在此处应用此方法   你正在努力的平台。

感谢。

答案 6 :(得分:1)

VBS脚本,它工作得很棒 http://www.go4expert.com/forums/showthread.php?t=18188

设置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

下一步

答案 7 :(得分:0)

推荐转换XLS: http://www.softinterface.com/Convert-XLS%5CConvert-XLS.htm

'转换XLS'是一个简单易用,但复杂的Excel转换器实用程序,专门为Excel,文本和CSV(字符/逗号分隔)文件设计。如果您需要转换/操作位于一个或多个文件夹中的一个或数千个文件,这就是工具!如果没有MS Excel,转换速度可以提高10-15倍。

使用以下方法自动执行Excel转换任务:

  • 内置调度程序
  • 命令行
  • 接口COM接口

答案 8 :(得分:0)

如果你有Cygwin,最可能的是你会有Python。如果没有 - 安装python并使用此script。它远远超过你的需要,但会很容易转换。

答案 9 :(得分:0)

@ John Machin: 我不能为这个论坛添加新的内容:)

我没有使用旧包 pyXLreader ,但请记住 xlrd 的帖子;)

我在一个月前看过,但没有在项目中使用过。

WBR

答案 10 :(得分:0)

我对这些论坛很新,如果他们把年份放在时间戳(宠儿小便)上会很好,所以我知道帖子的年龄。我想假设他们来自2009年。

但是python中的一个很好的解决方案是使用xlrd来读取你的xls文件。这是一个非常简单的介绍教程: http://scienceoss.com/read-excel-files-from-python/ 它不是我的。

我唯一的问题是excel日期。这是他们的快速解决方法:

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

使用内置的csv模块创建一个csv文件,因为我是一个新用户,我只能发布一个超链接。但谷歌的csv模块api。

希望这是有帮助的

答案 11 :(得分:0)

我的解决方案:

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; 

答案 12 :(得分:0)

您可以使用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语言结构(例如,请参阅User Manual)。