【问题标题】:I want to upload an excel spreadsheet to IIS and then import its contents我想将 Excel 电子表格上传到 IIS,然后导入其内容
【发布时间】:2009-07-21 00:45:40
【问题描述】:

我需要能够使用文件上传功能导入 Excel 电子表格的内容。用户必须能够将文件上传到 Web 服务器,然后该服务器将打开它并导入其内容。步骤是:

  1. 上传文件
  2. 打开它并从第一行读取列标题
  3. 将列映射到我可以接受的列
  4. 执行导入。

我可以使用 CSV 执行此操作,但 CSV 文件很容易损坏,因此我希望能够使用 Excel 文件执行此操作。除了作为字节流之外,我无法直接打开文件。

有什么帮助吗?

谢谢...

【问题讨论】:

  • 什么样的网络平台? php? ASP.NET?其他的?
  • 你能澄清“我不能直接打开文件,除非作为字节流”?这里的限制是您不能将文件持久化到磁盘,而是所有操作都需要使用 HTTP 请求字节流在内存中进行?
  • 您是在尝试打开 Excel 2003 (.xls) 还是 2007+ (.xlsx)?你用的是什么平台?
  • 我可以将它作为文件保存到服务器上的磁盘,我认为这是必需的。我必须使用这两个版本的 Excel,因为我无法控制我的用户将上传的文件类型。
  • Bob... 我发布的解决方案是 C#... 只是通过 IKVM 使用 Java 库。控制台应用程序有点慢,但在 ASP.net 上很快

标签: excel import


【解决方案1】:

我发现读取 Excel 文件的一种方法是使用 ODBC。我为一个类似的项目做过一次。基本上,您可以将 excel 文件视为单表“数据库”。从那里,您可以根据需要轻松查询行/列。

以下代码项目很好地总结了一切:

http://www.codeproject.com/KB/database/excel_odbc.aspx

【讨论】:

    【解决方案2】:

    我以前用 ASP.NET 做过这个,可能是出于同样的目的。基本上是允许将记录批量导入数据库。基本思路是:

    1. 让用户上传文件并 服务器将其保存在某处 文件系统

    2. Use ADO.NET to connect 到 Excel 文件,如 任何其他数据库连接

    3. 使用标准 ADO.NET 数据读取器和 数据表来获取数据和 将其加载到您的导入过程中

    使用 ADO.NET 的一个巧妙之处在于,您实际上可以修改 Excel 文件,在我的项目中,我通过在文件中记录每一行的状态或错误消息来做到这一点。然后我有一个界面,用户可以下载更新后的 Excel 文件,并知道哪些记录在导入时有问题,因此他们可以修复这些记录并再次尝试提交。

    编辑:如果要求您不能将文件写入磁盘并在 ADO.NET 连接字符串中引用它,那么您可能正在寻找一个能够使用 Excel 文件的第 3 方库记忆。看到这个other SO question

    【讨论】:

      【解决方案3】:

      SpreadsheetGear for .NET 可以从文件 (Factory.GetWorkbook(filename))、流 (Factory.GetWorkbookSet().Workbooks.OpenFromStream(stream)) 或字节数组 (Factory.GetWorkbookSet() .Workbooks.OpenFromMemory(byteArray)),并具有 Excel 兼容的 API,例如 workbook.Worksheets[index].Cells[row, col].Value,它返回单元格或 workbook.Worksheets[index].Cells[row 的原始值, col].Text 将单元格的格式化值作为字符串返回。

      您可以查看实时 ASP.NET 示例here 并下载免费试用版here

      免责声明:我拥有 SpreadsheetGear LLC

      【讨论】:

      • 看起来不错,但每个开发人员许可证的价格为 999 美元,并且要求每个接触产品中任何代码的开发人员都必须拥有许可证,他们的定价远远超出了我的钱包。
      • 我明白了。软件行业的任何人都知道,为软件定价并非易事。我们的客户购买了一些许可证并拥有数百万用户的应用程序 - 他们显然得到了非常好的交易。我们有几个客户购买了一个许可证并且他们是唯一的用户 - 他们显然为每个用​​户支付了相当多的费用,但发现了足够的价值(通常是因为优于 Excel 的性能优势)无论如何都要这样做。最后,它归结为工具为您节省了多少时间,以及它在多大程度上改进了您的应用程序。无论如何,祝你的申请好运:)
      【解决方案4】:

      您可以使用 Apache 的 POI。

      这是一个用于读写 MS Office 格式的 java 库。由于它是 java 并且您使用的是 C#,因此您需要 IKVM 和来自 POI Project 的 java 类。

      不过,最简单的方法是下载 Jon Iles excelent MPXJ project,然后您就搞定了。只需设置对IKVM.OpendJDK.ClassLibrary.dllIKVM.Runtime.dllpoi-3.2-FINAL-20081019.dll 的引用

      我编写了一个快速控制台应用程序,向您展示了一种读取 Excel 工作表的简单方法。它只读取第一张纸,不使用行或单元格迭代器,但它做得很好。

      我相信您只需付出很少的努力就能弄清楚如何使用输入流而不是文件。

      //C# code for using the Apache POI libraries
      using System;
      using System.Collections.Generic;
      using System.Text;
      
      
      // poi for xls
      using org.apache.poi;
      using org.apache.poi.poifs;
      using org.apache.poi.poifs.filesystem;
      using org.apache.poi.hssf;
      using org.apache.poi.hssf.usermodel;
      using org.apache.poi.ss;
      
      namespace ConsoleApplication1
      {
          class Test
          {
              static void Main(string[] args)
              {
      
                  if (args.Length != 1)
                  {
                      Console.Out.WriteLine("Usage: XLSReadTest <xls file>");
                  }
                  else
                  {
                      XLSRead x = new XLSRead();
                      x.Process(args[0]);
                      //x.Process("c:\\temp\\testfile.xls");
                  }
      
      
      
      
              }
          }
      
      
          class XLSRead
          {
              public void Process(string inputFile)
              {
      
      
                  int r = 0;
      
      
                  Console.Out.WriteLine("Reading input file started.");
                  DateTime start = DateTime.Now;
      
                  java.io.InputStream inputStream = new java.io.FileInputStream(inputFile);
                  POIFSFileSystem fs = new POIFSFileSystem(inputStream);
      
                  HSSFWorkbook wb = new HSSFWorkbook(fs);
                  HSSFSheet sh = wb.getSheetAt(0);
      
      
                  r = sh.getFirstRowNum();
                  while (r <= sh.getLastRowNum())
                  {
                      HSSFRow row = sh.getRow(r);
                      int c = row.getFirstCellNum();
                      string val = "";
      
                      while (c < row.getLastCellNum())
                      {
                          HSSFCell cell = row.getCell(c);
                          switch(cell.getCellType())
                          {
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                val = cell.getNumericCellValue().ToString();
                                break;
                            case HSSFCell.CELL_TYPE_STRING:
                                val = cell.getStringCellValue();
                                break;
                          }
                          Console.Out.WriteLine("Row: " + r + ", Cell: " + c + " = " + val);
                          c++;
                      }
                      r++;
                  }
      
                  long elapsed = DateTime.Now.Ticks - start.Ticks;
                  String seconds = String.Format("{0:n}", elapsed / 1000000);
                  Console.Out.WriteLine("\r\n\r\nReading input file completed in " + seconds + "s." + "\r\n");
      
      
      
              }
          }
      }
      

      【讨论】:

      • 当 POI 有可靠的 .NET 端口时,将 POI 与 IKVM 一起使用毫无意义:NPOI npoi.codeplex.com
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多