服务器读取excel文件,关于c#:作为服务器进程读取Excel文件

我试图找到一种适当的方法来读取NT服务器操作系统上的Excel文件的内容。 我在使用Excel API时遇到许多问题,然后在Office Automation上遇到了正式的Microsoft,它指出Excel API不适合Excel自动化。 我看到的排序问题与文章中描述的类似。

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

香港专业教育学院试图使这是一个更合适的问题。 这是一个很旧的代码,因此我无法提供任何示例代码/异常,但是我认为对于其他用户而言可能是值得的。

有许多库由不同的用户突出显示,它们允许所需的功能。我在这里列出了它们,并对其中一些进行了评估,因此在适当的地方,我试图提出一些有趣的评论以进行比较。我所包含的详细信息完全基于观点,但是这些库中的任何一个都可能实现所需的目标。

SpreadsheetGear.Net

(由于购买成本高而无法评估)

Aspose.Cells

(由一位同事评估。实施起来相当简单,性能可与Excel Interop媲美)。

宝石盒

(未评估)

Excel服务

(似乎仅包含在SharePoint 2007中)

Excel Mapper

(没有评估,因为它要求将强类型的对象导入其中而不符合我的要求)。

SmartXls

(没有评估,因为它要求将强类型的对象导入其中而不符合我的要求)。

ActiveXls

(相当容易使用,缺少Properties会引发问题,他们偏向于琐碎的操作方法。尽管声称1M记录是由便宜的FlexCel执行的,但已经决定了help / API手册几乎是无用的。)

库格拉

(由于未找到任何文档/信息而未进行评估)

文件助手

(未评估)

Flexcel

(找到了最低成本的解决方案,性能良好,并且易于实现,并且非常接近Excel Interop结构。也得到了支持人员对技术问题的快速响应。可能是我的选择。)

SyncFusion BackOffice

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

出色的工作伊恩。您可能想突出显示Flexcel,因为它是您选择的选项。看起来很不错。

嗨,伊恩,谢谢你的推荐。您知道吗,这些库中是否有一个支持包含宏/ VBA函数的电子表格的计算?我很难找到....

@Marc:我怕我不知道-我没有深入研究高级用法。我相信FlexCel可以使用某种方式注册自定义事件+代码,但基本上必须在您的C#代码库中进行复制。

嗨,伊恩,没关系,非常感谢您!该列表确实有帮助!香港专业教育学院尝试了几乎所有的人,似乎没有人支持VBA的计算...祝您好运!

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

这是一个用于读写MS Office格式的Java库。由于它是Java,并且您正在使用C#,因此需要IKVM和POI项目中的java类。

但是,最简单的方法是仅下载Jon Iles优秀的MPXJ项目,您已经掌握了全部。只需设置对IKVM.OpendJDK.ClassLibrary.dll,IKVM.Runtime.dll,poi-3.2-FINAL-20081019.dll的引用

我共同编写了一个快速的控制台应用程序,向您展示了一种读取Excel .xls工作表的简单方法。它仅读取第一张工作表,并且不使用行或单元格迭代器,但是可以很好地完成工作。

注意:您需要查看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 ");

}

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("

Reading input file completed in" + seconds +"s." +"

");

}

}

}

标记,不适添加到读者列表。老实说,对于我正在从事的项目,我们可能不希望采用这种方式,因为其中涉及的库更多,从而导致更多的维护等。我们需要一些简单的方法来以合理的成本实现免维护的免维护费。这些是我一直在评估可能性的一些事情,我认为这可能有点涉及。

我以前使用过ADO.NET从xls中获取数据。我不确定这将支持所有的Excel Doc类型,但请查看使用ADO.NET C#DbProviderFactory读取和写入Excel电子表格。

这也是来自SO问题的一些代码。

我无需安装Office或任何第三方工具就可以读写excel。

ADO.NET实际上对此非常有效,根本不需要安装Excel。

不幸的是,ADO无法满足我们的需求。我不确定细节,但另一位开发人员未能完全按照我们想要的方式工作,因此ADO是行不通的。不过谢谢你的帖子。

如果您可以获得更多信息,我们可能可以帮助您解决ADO.NET中遇到的问题。

用于Excel的OLEDB / ODBC接口不支持SpreadsheetML或OpenXML格式,存在工作表和命名范围与某些命名约定不匹配的问题,如果列的前几行不包含长度大于255的数据,则可能导致截断字符,然后是在这些列中具有较长字符串的行。这些只是我从做这些日子以来记得的一些问题。现在,我仅导出和导入SpreadsheetML,这是对用户的轻微培训问题,但在应用程序稳定性方面带来了巨大的好处。

我认为为了这个线程的好处,我不得不提到EPPlus。它是一个可在Codeplex中使用的开源项目。

我已经在多个项目中使用了它,但从未遇到过问题。

您是否尝试过.net的SmartXLS?

还是ActiveXLS?

不,我没有。谢谢你的建议。

这是可以读取.xls和xlsx文件的内容。它是开源的。 http://code.google.com/p/excelmapper/。

它基本上是一个ORM,因此您只需要处理对象而不是OleDB。

我实际上是在发布此信息后才发现的。 Havent有机会对此进行了调查,但谢谢。

不幸的是,我认为那不是我想要做的事情。查看Excel映射器,似乎它仅导入具有给定结构的对象,因此有很多要填充的强类型字段。我的数据一开始是未知类型,然后我需要阅读Excel并从中确定类型,因此我认为这不适合该任务。

Ian,ExcelMapper下载包含一个exe(BuildDTOsFromExcel),您可以在excel文件上运行该文件以生成强类型对象。它将根据列数据找出数据类型。正如您提到的,这里的问题是,每次更改数据类型时都必须运行此程序,因此某种程度上它必须事先知道数据类型。

这很公平,但是我们已经有一个通用的系统可以执行此操作,并且需要读取我可能应该在原始帖子中建议的RAW数据。

Excel。

经过多年努力阻止人们在服务器上使用Excel,他们已经放弃/拥抱了市场需求,并开始对此提供支持。

2007年对此有所改进,而Excel 2010应该具有更多改进。

斯科特,我们必须至少支持Excel 2003(可能是2000)。我们需要支持的至少一个版本无法在Vista服务器上运行。因此,如果我们可以使用Excel,则根本没有帮助。

我不确定为什么SO广告与您的问题无关。

微软有类似的东西叫做Excel Services。我想,这可以让您以网络服务风格使用Excel。我认为SpreadSheetGear是Microsoft用来显示的广告。 :)

你可能感兴趣的:(服务器读取excel文件)