代码之家  ›  专栏  ›  技术社区  ›  nik

将excel(xls)文件转换为不带gui的逗号分隔(csv)文件

  •  21
  • nik  · 技术社区  · 15 年前

    有没有一种简单的方法可以在不启动excel窗口应用程序的情况下将xls转换为csv格式的文件?

    我需要用脚本处理一些excel xls工作手册。为此,我需要将xls文件转换为csv文件。这可以通过Excel应用程序的保存来完成。但是,我想自动化这个(所以,不要打开excel应用程序窗口)。

    如果工作簿中的第一张工作表被转换为csv格式就足够了。 我只需要处理那张表上的数据。

    我的系统上安装了cygwin和excel——如果有帮助的话。

    编辑:好的,我有一个Perl的工作解决方案。更新以供其他人将来使用。

    我安装了 电子表格::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
        }
    }
    

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

    13 回复  |  直到 8 年前
        1
  •  3
  •   PatrickBateman    15 年前

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

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

    也可以尝试使用vbscript。

        2
  •  6
  •   Amandasaurus    15 年前

    如果您在Debian/Ubuntu上,可以使用CATDOC包中的XLS2CSV

        3
  •  4
  •   jens    15 年前

    在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
  •  4
  •   Marcello Nuccio    8 年前

    Gnumeric docs :

    GNICIC可以自动转换文件,而不需要用户干预。这允许使用脚本转换大量文件。gnumeric与一个名为 ssconvert 它是用来自动转换文件的程序。除了通过打印系统运行的PASScript和PDF文件格式外,所有的GMICIC支持的文件格式都可以使用。

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

    ssconvert myfile.xls myfile.gnumeric
    

    将excel格式文件转换为gnumeric格式文件。

    可以使用SSLCAN读取的可用的导入和导出文件格式。

    ssconvert --list-importers
    

    ssconvert --list-exporters
    

    分别是。

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

    man ssconvert
    

    这将打开手册页。可以通过键入空格键或使用页向上和向下页按钮来导航此页。可以通过键入Q键来删除人程序。

    我在用,而且效果很好。

        5
  •  2
  •   Denis Barmenkov    15 年前

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

    pyxlreader.sourceforge.net/

    sourceforge.net/projects/pyexcelerator

    在上面加上额外的脚本层。

        6
  •  2
  •   this. __curious_geek    15 年前

    Excel可以用作数据源,也有驱动程序可以访问Excel作为数据库。

    1.)创建并打开到Excel文件的连接,您希望将其转换为CSV。

    2.)启动一个类似“select*from sheet1”的查询,将sheet1的所有数据加载到记录集或数据表中。

    3)由于我使用.NET,我可以在DATAATE上保存这些记录,并使用以下扩展方法转换成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
  •  1
  •   Rasterman    13 年前

    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
    

    接下来

        8
  •  0
  •   William Leara    15 年前

    建议转换xls: http://www.softinterface.com/Convert-XLS%5CConvert-XLS.htm

    convert xls是一个简单易用但复杂的excel转换器实用程序,专门为excel、文本和csv(字符/逗号分隔)文件设计。如果需要转换/操作位于一个或多个文件夹中的一个或数千个文件,这是一个工具!转换可以在没有MS Excel的情况下完成10-15倍的速度。

    使用以下命令自动执行Excel转换任务:

    • 内置调度程序
    • 命令行
    • 接口COM接口
        9
  •  0
  •   praavDa    15 年前

    如果你有cygwin,很可能你会有python。如果不是-安装python并使用 script . 它比你所需要的要多得多,但会很容易很快转变。

        10
  •  0
  •   Denis Barmenkov    15 年前

    @约翰·梅钦: 我不能添加coment,因为我是这个论坛的新手:)

    我没有用旧包装 保字器 但让我的职位 XLRD 铭记;

    我一个月前看过,但没用在工程上。

    WBR

        11
  •  0
  •   theManicStreetPreacher    15 年前

    我对这些论坛很陌生,如果他们把年份贴在时间戳上(pet peve)会很好,这样我就知道这些帖子有多老了。我想他们是2009年的。

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

    我唯一的问题是Excel日期。这里有一个快速的解决方法:

    date=xlrd.xldate作为元组(int(sheet.cell(rownum,colnum.value),workbookname.datemode)

    而不是用内置的CSV模块创建一个CSV文件,作为一个新的用户,我只能发布一个超链接。但是google的csv模块api。

    希望得到帮助

        12
  •  0
  •   Mr.P    11 年前

    我的解决方案:

    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
  •  0
  •   agershun    10 年前

    您可以用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 例如)。