C# 读取 Excel

(问题)总结

(记录的是所知的,有些不全或欠缺知道方向就行了)
C# 读取 Excel出现问题
总结:
Excel版本导致的Provider、Extended Properties不同
Excel的格式不一样,右键新建xml,软件内新建xlsx
表名加方括号
拓展字那里Excel 8.0,要有空格
导包,除了最后一个要加,其它三个也不知道具体作用(都加吧,第一个是为了导出正确格式,没用到)
在这里插入图片描述
(不确定其具体作用,因为报错信息有没有变没印象)
开启32位线程池
安装32位AccessDatabaseEngine

之前的代码(不完整)

            //connect
            string source = @"D:\Data\Projects\VisualStudio\VisualStudio2019\Unity Siki CSharp高级\79 Excel\Excel.xls";
            string connectionString = "Provider = Microsoft.Jet.OLEDB.4.0;" 
                + "Data Source=" + source +";"
                + "Extended Properties=\"Excel8.0;HDR=YES;IMEX=1\"" ;
            OleDbConnection oleDbConnection = new OleDbConnection(connectionString);

            //query
            oleDbConnection.Open();
            string tableName = "Excel$";
            string sql = "select * from "+ tableName;
            OleDbDataAdapter adapter = new OleDbDataAdapter(sql, oleDbConnection);

之后的代码(完整)

using System;
using System.Data;
using System.Data.OleDb;

namespace _79_Excel
{
    class Program
    {
        static void Main(string[] args)
        {

            //connect
            string source1 = @"D:\Data\Projects\VisualStudio\VisualStudio2019\Unity Siki CSharp高级\79 Excel\Excel.xls";//新建xlsx,改为xls
            string source2 = @"D:\Data\Projects\VisualStudio\VisualStudio2019\Unity Siki CSharp高级\79 Excel\Excel_2003.xls";//新建xls
            string source3 = @"D:\Data\Projects\VisualStudio\VisualStudio2019\Unity Siki CSharp高级\79 Excel\Excel_2007.xlsx";//新建xlsx
           string source4 = @"D:\Data\Projects\VisualStudio\VisualStudio2019\Unity Siki CSharp高级\79 Excel\Excel_2007_xlsx.xlsx";//在Excel里面新建文件            	
           string connectionString = "Provider = Microsoft.ACE.OLEDB.12.0;";
            connectionString += "Data Source=" + source4 + ";";
            connectionString += "Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";

            //string connstr = "Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False;Data Source=" + @Excfilename + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";
            /**
             * Microsoft.ACE.OLEDB.12.0 == xlsx
             * Microsoft.Jet.OLEDB.8.0 == xls
             * Excel12.0 ==xlsx Excel18.0==xls
             * HDR  首行是不是标题
             * IMEX 0只写 1只读 2读写
             * Extended Properties="'......'",可以
             * Extended Properties="/"....../"",可以
             */



            OleDbConnection oleDbConnection = new OleDbConnection(connectionString);

            //query
            oleDbConnection.Open();
            string tableName1 = "Excel$";
            string tableName2 = "Excel_2003$";
            string tableName3 = "Excel_2007$";
            string tableName4 = "[Sheet1$]";
            string sql = "select * from "+ tableName4;
            OleDbDataAdapter adapter = new OleDbDataAdapter(sql, oleDbConnection);

            //DataSet
            DataSet dataSet = new DataSet();//容器
            adapter.Fill(dataSet);

            //close
            oleDbConnection.Close();


            //table
            DataTableCollection tableCollection = dataSet.Tables;
            DataTable dataTable = tableCollection[0];//第一张表

            //row
            DataRowCollection rowCollection = dataTable.Rows;
            foreach (DataRow dataRow in rowCollection)
            {
                for(int i=0;i<rowCollection.Count;i++)
                {
                    Console.Write(dataRow[i] + "\t");

                }
                Console.WriteLine();
            }


            Console.ReadKey();
        }
    }
}

(Done,不确定具体作用)系统没有“internet信息服务(IIS)管理器”

练习VS中读取Excel(.xls)文件时,出现对"Provider = Microsoft.Jet.OLEDB.4.0;"的 在本地机器未注册, 需要启用“Internet 信息服务(IIS)管理器”功能,并且将程序池水设置为32true

(Done)‘Microsoft.Jet.OLEDB.4.0’ provider is not registered on the local machine.”

系统没有“internet信息服务(IIS)管理器”

(Done)在电脑上没有找到服务WAS

在这里插入图片描述

在计算机“.”上没有找到WAS服务

将项目的AnyCpu改成x86,
不知道什么时候,发现.xls的绿色图标加载出来

(Done,但不确定具体起作用)找不到msexcl40.dll,Regsvr32加载失败

在这里插入图片描述

(没用)System.Data.OleDb.OleDbException:“找不到可安装的 ISAM。”(卡住)

【未解决】System.InvalidOperationException: 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
没用,把IMEX=1’去掉就行了

(需知)拓展字Excel版本

Excel拓展字介绍
Excel是2003还是2007还是怎么看

(Done)找不到Microsoft.ACE.OLEDB.12.0

System.InvalidOperationException:“The ‘Microsoft.ACE.OLEDB.4.0’ provider is not registered on the local machine.”
xls是2003,Microsoft.Jet.OLEDB.4.0
xlsx是2007,Microsoft.ACE.OLEDB.12.0
两个都是Excel 8.0

下载AccessDatabaseEngine
安装32还是64,电脑64;之前也提到32位程序池。先试64(两者安装冲突),结果是32位

(继续显示)System.Data.OleDb.OleDbException:“找不到可安装的 ISAM。”

(Done)System.Data.OleDb.OleDbException:“外部表不是预期的格式。”

8.0那里空了个格,要空格。就是这样ISAM错误没了,虽然出现其他错误

            string connectionString = "Provider = Microsoft.ACE.OLEDB.12.0;";
            connectionString += "Data Source=" + source + ";";
            connectionString += "Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";

(Done)Excel文件问题

//新建xlsx,改为xls(我选的,常用xlsx,视频是xls,所以有改了回来)
//新建xls
//新建xlsx

(没用)外部表不是预期的格式

c#.net:System.Data.OleDb.OleDbException: 外部表不是预期的格式的解决办法

(Done)Excel可能不是标准的xls,而是关于xml

检测该文件是否为标准的.xls的文件

Done 需要Net5.0

在这里插入图片描述

先打开Excel,再新建文件。不要再资源管理器里面鼠标右键
还有直接复制粘贴其他表格的内容,可能也有问题。自己手敲吧。(试了没问题)

(新进展,完成)System.Data.OleDb.OleDbException:“FROM 子句语法错误。”

补上表名中的方括号

(完成)打印

在这里插入图片描述

在这里插入图片描述

<think>好的,我需要回答用户关于如何用C#读取Excel文件的方法或库的问题。首先,用户提供了几个引用,我需要先仔细看一下这些引用内容。 引用[1]提到C#中有多种方法,包括EPPlus、NPOI、Microsoft.Office.Interop.Excel等库。引用[2]和[3]也提到了类似的方法,并且引用[4]和[5]具体提到了ExcelDataReader这个免费库的使用。看来用户需要的是具体的库推荐和示例代码。 接下来,我需要整理这些信息,确保回答结构清晰。根据引用中的内容,常用的库有四个:EPPlus、NPOI、Microsoft.Office.Interop.ExcelExcelDataReader。每个库的特点和适用场景可能不同,比如EPPlus支持.xlsx,而NPOI支持新旧格式,Interop需要安装ExcelExcelDataReader适合跨平台。 然后,我需要为每个库提供示例代码。例如,EPPlus的示例可能包括打开文件读取单元格;NPOI的示例可能涉及工作簿和表单的获取;Interop需要启动Excel应用并读取数据;ExcelDataReader结合DataSet加载数据。需要注意代码的正确性,比如使用using语句释放资源,处理可能的异常。 同时,根据用户提供的系统级指令,行内数学表达式要用$...$,但这里可能用不到数学公式。需要检查LaTeX语法是否正确,但代码块部分不需要。回答需要使用中文,并且生成相关问题。 最后,确保在引用部分正确标注来源,比如引用[^1]到[^5],根据用户提供的引用内容对应到相应的库或方法。例如,EPPlus在引用[1]和[4]中可能被提到,ExcelDataReader在引用[5]中。需要确保每个示例的引用正确,避免混淆。 可能需要注意用户提到的“免费库”,所以在介绍Interop时需说明它是商业组件需要授权。此外,ExcelDataReader可能需要配合其他库如System.Data处理DataSet,这点在示例中要注明。 现在整理回答的结构,先介绍四个库,每个库的步骤和示例代码,然后总结适用场景,最后添加相关问题。确保每个部分引用正确,末尾添加相关问题,如性能比较、处理大数据、跨平台选择等,帮助用户进一步探索。</think>### C# 读取 Excel 文件的方法及库示例 以下是 C# 中常用的几种读取 Excel 文件的方法及相关库,结合代码示例说明: --- #### 1. **使用 EPPlus(推荐新格式 `.xlsx`)** EPPlus 是一个开源库,支持读写 `.xlsx` 文件且无需安装 Excel。 **步骤与示例代码:** ```csharp using OfficeOpenXml; public void ReadExcelWithEPPlus(string filePath) { FileInfo file = new FileInfo(filePath); using (ExcelPackage package = new ExcelPackage(file)) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; int rowCount = worksheet.Dimension.Rows; for (int row = 1; row <= rowCount; row++) { string cellValue = worksheet.Cells[row, 1].Text; Console.WriteLine(cellValue); } } } ``` **特点:** - 轻量高效,支持公式和样式操作[^4]。 --- #### 2. **使用 NPOI(支持旧格式 `.xls` 和 `.xlsx`)** NPOI 是 Apache 的开源库,兼容性强,适合跨平台场景。 **示例代码:** ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; public void ReadExcelWithNPOI(string filePath) { using (FileStream stream = new FileStream(filePath, FileMode.Open)) { IWorkbook workbook = new XSSFWorkbook(stream); // .xlsx 文件 ISheet sheet = workbook.GetSheetAt(0); for (int row = 0; row <= sheet.LastRowNum; row++) { IRow currentRow = sheet.GetRow(row); string cellValue = currentRow?.GetCell(0)?.ToString(); Console.WriteLine(cellValue); } } } ``` **特点:** - 支持旧版 `.xls`,无需 Office 依赖[^1][^3]。 --- #### 3. **使用 Microsoft.Office.Interop.Excel(需安装 Excel)** 通过 COM 组件操作 Excel,功能全面但依赖本地 Excel 环境。 **示例代码:** ```csharp using Excel = Microsoft.Office.Interop.Excel; public void ReadExcelWithInterop(string filePath) { Excel.Application excelApp = new Excel.Application(); Excel.Workbook workbook = excelApp.Workbooks.Open(filePath); Excel.Worksheet worksheet = workbook.Sheets[1]; Excel.Range range = worksheet.UsedRange; for (int row = 1; row <= range.Rows.Count; row++) { string cellValue = range.Cells[row, 1].Value2?.ToString(); Console.WriteLine(cellValue); } workbook.Close(); excelApp.Quit(); } ``` **注意:** - 需在项目中添加 `Microsoft.Office.Interop.Excel` 引用。 --- #### 4. **使用 ExcelDataReader(轻量级读取)** ExcelDataReader 专注于快速读取数据,适合简单场景。 **示例代码:** ```csharp using ExcelDataReader; using System.Data; public void ReadExcelWithExcelDataReader(string filePath) { using (var stream = File.Open(filePath, FileMode.Open)) { IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream); DataSet result = reader.AsDataSet(); DataTable table = result.Tables[0]; foreach (DataRow row in table.Rows) { Console.WriteLine(row[0]); } } } ``` **特点:** - 跨平台支持,需配合 `System.Data` 使用[^5]。 --- ### **总结与适用场景** | 方法 | 格式支持 | 依赖环境 | 适用场景 | |---------------------|--------------|-------------------|---------------------------| | EPPlus | `.xlsx` | 无 | 高效读写新格式文件 | | NPOI | `.xls/.xlsx` | 无 | 兼容旧格式或跨平台需求 | | Office.Interop.Excel| `.xls/.xlsx` | 需安装 Excel | 复杂操作(如宏、图表) | | ExcelDataReader | 多格式 | 无 | 快速读取数据到 DataSet | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值