如何使用C#读取Excel .XLS文件

4

我知道我们可以通过以下方式读取excel.xls文件:

  • OleDB:但是我们不能在服务器上安装OleDB驱动程序。
  • Interop:但是我们不能在服务器上安装MS Office。
  • ExcelDataReader:不允许使用第三方软件包或DLL。

我们可以使用FileStream来读取平面文件,难道没有使用.NET Framework内置类库读取.xls文件的方法吗?


你能让那些 .xls 文件与 .xlsx 兼容吗?这样你就可以使用 System.Io.Package 命名空间了。 - Rubens Farias
除了使用第三方库,可能没有其他方法可以读取Excel文件。您可以研究文件结构并创建自己的库。在Java中,我们使用POI - SedJ601
1
我可以建议对该Excel文件进行预处理,将其转换为文本文件或在服务器端进行更简单的操作。顺便说一句,在记事本中打开它,以检查它是否只是一个重命名的HTML文件。 - Rubens Farias
1
你可以使用filestream读取.xls文件,但问题不在于读取文件,而在于解释内容。如果没有第三方库或Excel PIA,你不可能成功地完成这项任务(.xls文件结构过于复杂,.xlsx也很难但可行)。我认为Microsoft不支持将Excel PIA用作多用户服务器解决方案,只能用作桌面单用户解决方案,可能是出于许可和线程原因。 - Phil
1
你最好的选择是使用ACE OleDB驱动程序,因为它是唯一可以在服务器环境中使用的选项。"Windows Server 2003 R2 (32-Bit x86), Windows Server 2003 R2 x64 editions, Windows Server 2008 R2, Windows Server 2008 Service Pack 2, Windows Server 2012 R2"。请记住,您不能在服务器上使用Excel COM互操作。 - user585968
显示剩余2条评论
3个回答

2
这里有一个简单的例子可以让您开始。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel; 

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            Excel.Range range ;

            string str;
            int rCnt ;
            int cCnt ;
            int rw = 0;
            int cl = 0;

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(@"d:\csharp-Excel.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;
            rw = range.Rows.Count;
            cl = range.Columns.Count;


            for (rCnt = 1; rCnt  < = rw; rCnt++)
            {
                for (cCnt = 1; cCnt  < = cl; cCnt++)
                {
                    str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2;
                    MessageBox.Show(str);
                }
            }

            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            Marshal.ReleaseComObject(xlWorkSheet);
            Marshal.ReleaseComObject(xlWorkBook);
            Marshal.ReleaseComObject(xlApp);

        }

    }
}

http://csharp.net-informations.com/excel/csharp-read-excel.htm

请记得添加对Microsoft Excel 15.0对象库的引用。


1
使用Microsoft Primary interop assemblies (PIA) for Excel(即您的选项中的“Interop”)是从C#读取xls文件最公平的方法。但是,它有一个很大的缺点,需要在运行此代码的计算机上安装Microsoft Excel。这些库是Excel应用程序上方的某种包装器,但它应该允许您读取可以从Excel对象模型中获得的所有内容。
根据我的经验,这种方式对于桌面应用程序来说更或多或少是好的,但对于服务器端Excel文件处理来说不是很好。

PIA对服务器来说很糟糕,因为它实际上在后台运行完整的Excel程序实例。非常占用内存。 - Joel Coehoorn
OP已经非常清楚地表明了:“Interop: 但是我们不被允许在服务器上安装MS Office”。当OP说“不被允许...服务器”时,这并不是来自他的雇主的观点,而是微软的观点。这是“最大的缺点”。 - user585968
我不相信微软会禁止它 - 他们只是不建议或支持它。 - NetMage
@MickyD 微软的批量许可条款是不同的。 - NetMage

0

如果您可以将Microsoft Open XML 2 SDK添加到您的应用程序中,您就可以读取现代Open XML文件格式,然后解析Excel数据的XML文件。

如果您无法使用Microsoft的解决方案,您将不得不编写自己的代码,使用Open XML文件格式作为指南。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接