【问题标题】:converting an Excel (xls) file to a comma separated (csv) file without the GUI在没有 GUI 的情况下将 Excel (xls) 文件转换为逗号分隔 (csv) 文件
【发布时间】:2010-10-30 21:34:48
【问题描述】:

有没有一种简单的方法可以在不启动 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 blogand, 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
    }
}

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

【问题讨论】:

  • New-Object -comobject Excel.Application 看起来它会启动 Excel 应用程序——你说过你不想这样做。
  • @John,感谢您指出这一点。我喜欢并使用了 Perl 解决方案。
  • 这是一个很好的问题。我设法运行代码并按预期返回用逗号分隔的 Excel 条目。抱歉这个愚蠢的问题,但如何将最终信息实际保存在 csv 文件中?

标签: excel scripting csv


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    pyxlreader.sourceforge.net/

    sourceforge.net/projects/pyexcelerator

    并在其上制作额外的脚本层。

    【讨论】:

    • 这可能也是一个不错的选择。我很快就让 Perl 解决方案为我工作,所以我停了下来。
    【解决方案3】:

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

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

    2.) 触发类似“SELECT * From Sheet1”的查询,这会将 Sheet1 的所有数据加载到记录集或数据表中。

    3.) 由于我使用的是 .net,因此我可以将这些记录保存在数据表中,并使用以下扩展方法转换为 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();
            }
    

    您可以将这种方法应用于 您正在开发的平台。

    谢谢。

    【讨论】:

      【解决方案4】:

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

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

      您也可以尝试使用 VBScript。

      【讨论】:

        【解决方案5】:

        在 Java 世界中,您可以使用 apache poi。您可以从以下 Groovy sn-p 开始。

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

        【讨论】:

          【解决方案6】:

          如果你有 Cygwin,很可能你会拥有 Python。如果没有 - 安装 python 并使用这个script。它比您需要的要多得多,但可以轻松快速地转换。

          【讨论】:

            【解决方案7】:

            @约翰·马钦: 我无法添加评论,因为我是这个论坛的新手 :)

            我没有使用旧包 pyXLreader,但在发帖时要考虑 xlrd ;)

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

            WBR

            【讨论】:

              【解决方案8】:

              我对这些论坛很陌生,如果他们把年份放在时间戳上会很好(讨厌),这样我就知道帖子的年龄了。我会假设它们是从 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。

              希望对你有帮助

              【讨论】:

              • Python xlrd 在我发布这个问题的那天被 praavDa 指出,几天后作者 John 自己也添加了一个帖子。
              【解决方案9】:

              如果你在 Debian/Ubuntu 上,你可以使用 catdoc 包中的 xls2csv

              【讨论】:

              • 听起来很有趣,我会在 Ubuntu 上查看。
              【解决方案10】:

              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
              

              下一个

              【讨论】:

              【解决方案11】:

              来自Gnumeric docs

              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 按钮来导航此页面。输入 q 键可以关闭 man 程序。

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

              【讨论】:

                【解决方案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 (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)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-09-18
                    • 2018-04-03
                    • 2011-01-29
                    • 1970-01-01
                    • 2016-08-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多