0

在我工作的地方,我需要从中提取信息的数百个 xlsx 文件(使用 Office 2010 Starter 创建)。这只是一次性的工作,所以问题是哪种方式最快。现有工具?编程解决方案?

信息只是字符串,格式无关紧要。这些文件包含客户数据。每位客户一份文件。在你问之前,是的,这是一个愚蠢的系统——我们正在放弃它。因为我们现在要迁移到一个新系统,所以我们需要将现有的客户数据导出为一个 CSV 文件,该文件可以导入到新系统中。

如果我要编写一个计算机程序来执行此操作,我需要能够访问每个文件中的第一个工作表,并且能够读取任何给定单元格(A1、C5 等)的内容。就是这样。

由于 xlsx 文件只是一些压缩的 XML 文件,因此一种方法是编写解压缩和解析 XML 文件的代码。这听起来像是一个非常耗时的解决方案,所以如果存在免费库,我宁愿使用它。

在这里可能有用的语言中,我最擅长 C++ 和 C,但也做过一些 C#、VB6 和 VB.NET,以及一点点 Python。

4

3 回答 3

4

如果尚未将所有 Excel 文件放在一个文件夹中,请按照以下步骤操作:

  1. 打开一个空白工作簿
  2. 打开 VBA 编辑器Alt+F11
  3. 添加模块:插入 --> 模块
  4. 将以下代码添加到模块中(将目录字符串更改为指向要转换的 Excel 文件所在的目录)
  5. 逐步检查几个文件以确保它正在执行您期望的操作
  6. F5在所有文件上运行
  7. 告别旧系统

代码:

    Option Explicit

    Sub ExportAllToCSV()
        Dim Directory As String
        Dim i As Long
        Dim file As String
        Directory = "C:\workbooks\"
        i = 1

        Application.DisplayAlerts = False
        Application.ScreenUpdating = False

        ' Get the first file
        file = Dir(Directory, vbReadOnly + vbHidden + vbSystem)

        Do While file <> ""
            If Right(file, 4) = "xlsx" Then ' change to right(file ,3) = "xls" if you have xls files instead of xlsx
                Workbooks.Open Filename:=file
                ActiveWorkbook.SaveAs Filename:="C:\workbooks\file" & i & ".csv", FileFormat _
                            :=xlCSV, CreateBackup:=False
                ActiveWorkbook.Close
                i = i + 1
            End If

            ' Get the next file
            file = Dir()
        Loop

        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
    End Sub
于 2012-06-01T20:44:20.907 回答
0

我建议使用Excel 互操作 API。如何使用 API 的示例在这里

于 2012-06-01T16:20:59.910 回答
0

由于您提到可以使用 C#,因此有一个出色的 Excel 2007+ 文件库EPPlus。以下是一些帮助您入门的示例:

  ExcelPackage ep = new ExcelPackage(new FileInfo("excelfile.xlsx"));
  // take the first sheet 
  // or you could get the Worksheet with name : ep.Workbook.Worksheets["Sheet1"]
  ExcelWorksheet ws = ep.Workbook.Worksheets[0];

  // now you can get data
  // cell data from row 3, column 2 (first row or column is 1 not 0)
  string data = ws.Cells[3, 2].Value.ToString();
  // from A5 cell
  string data1 = ws.Cells["A5"].Value.ToString();

  // you can find out how many rows are there 
  int maxRow = ws.Dimension.End.Row;
于 2012-06-01T21:14:44.497 回答