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

作为服务器进程读取Excel文件

  •  11
  • Ian  · 技术社区  · 17 年前

    我正在试图找到一种在NT服务器操作系统上读取Excel文件内容的适当方法。我在使用excelapi时遇到了很多问题,然后遇到了官方的问题 Microsoft on Office Automation 这表明Excel API不适合Excel自动化。我看到的问题与文章中描述的类似。

    有没有另一种方法可以让我在服务器(无UI)上读取Excel文件(xls、xlsx、xlsm),而不会遇到Excel API中强加的相同类型的线程/安全/许可问题?

    8 回复  |  直到 13 年前
        1
  •  19
  •   Ian    13 年前

    有许多库由不同的用户突出显示,这些库允许所需的功能。我在这里列出了它们,并对其中一些进行了评估,因此在适当的情况下,我尝试写下有趣的评论,以便对它们进行比较。我所包含的细节完全是基于意见的,但是这些库中的任何一个都可能达到所需的目标。

    SpreadsheetGear.Net
    (由于采购成本高,未进行评估)

    Aspose.Cells
    (由一名同事评估。似乎实现起来相当简单,性能与Excel Interop相当)。

    GemBox

    Excel Services
    (似乎仅包含在SharePoint 2007中)

    Excel Mapper

    SmartXls
    (未计算,因为它需要导入不符合我要求的强类型对象)。

    ActiveXls

    Koogra

    FileHelpers

    Flexcel

    SyncFusion BackOffice
    (中等成本,结构合理。不幸的是,在运行单元测试时,实现更困难,结果不一致。还收到了许多“尝试读取受保护内存”错误,这不鼓励我使用纯托管库。)

        2
  •  3
  •   Community Mohan Dere    9 年前

    我以前使用过ADO.NET从xls中获取数据。我不确定它支持的所有Excel文档类型,但请签出 Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    Here is some code 从一个所谓的问题。

    我能够读写excel,而无需安装Office或任何第三方工具。

        3
  •  2
  •   Mark Nold    17 年前

    要使用C#读取Excel文件而不安装Excel,可以使用Apache的POI。

    这是一个用于读写MS Office格式的java库。因为它是java,而且您使用的是C语言,所以您需要 IKVM 以及 POI Project

    然而,最简单的方法就是下载Jon Iles Excellent MPXJ project 你已经拥有了一切。只需设置一个引用即可 IKVM.OpendJDK.ClassLibrary.dll , IKVM.Runtime.dll poi-3.2-FINAL-20081019.dll

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

    NB:你需要看看 org.apache.poi.ss 确保你能阅读 .xlsx

    //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");
    
    
    
            }
        }
    }
    
        4
  •  1
  •   shahkalpesh    17 年前

    我不知道为什么这样的广告与你的问题不相关。

    微软也有类似的软件叫做Excel Services。我想,这可以让您在Web服务风格中使用Excel。我认为SpreadSheetGear是微软使用的,就像广告用来显示的一样。:)

        5
  •  1
  •   Scott Weinstein    17 年前

    擅长

    在多年试图阻止人们在服务器上使用Excel之后,他们已经放弃/接受了市场需求,并开始支持这一点。

    2007年在这方面有了一些改进,而Excel 2010应该还有更多改进。

        6
  •  1
  •   anonymous anonymous    17 年前

    http://code.google.com/p/excelmapper/

    它基本上是一个ORM,所以你只需要处理对象而不是OleDB。

        7
  •  1
  •   liya    17 年前
        8
  •  1
  •   Jack7    13 年前

    codeplex .

    我在多个项目中使用过这个,从来没有遇到过问题。