C#解析Excel汇总

项目中多次用到对Excel的操作,想想有必要对这些方式、方法进行汇总,以便能够在整体上有个清晰的认识,本篇文章主要讨论使用C#对Excel操作、解析的三种方式:OleDb、Com组件、NPOI

1.OleDb

该方法简单快速,能够操作高版本的Excel,缺点是不够灵活,只能对Excel进行简单的读写操作。在最开始接触编程的时候,便有所耳闻:Object Link andembed(对象连接与嵌入),其主要目的是为了兼容更多类型的数据源。是较底层化的操作,在使用上非常复杂,另外一个特点是可以直接使用SQL语句对Excel数据源进行操作:

<span style="white-space:pre">	</span>/// <summary>
        /// 从Excel中读取数据到DataTable的方法
        /// </summary>
        /// <param name="strSavePath">文件保存路径</param>
        /// <param name="strSheetName">Sheet名称</param>
        /// <returns></returns>
        protected DataTable ExcelToDataTable(string strSavePath, string strSheetName)
        {
            #region 读取文件Sheet,转换为DataTable
            string strConn;
			string strFileType = System.IO.Path.GetExtension(strSavePath);
            if (string.IsNullOrEmpty(strFileType)) return null;

			if (strFileType == ".xls")
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strSavePath+ ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
            else
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strSavePath+ ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; 

            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [" + strSheetName + "$]", strConn);
            DataSet myDataSet = new DataSet();
            try
            {
                myCommand.Fill(myDataSet, "ExcelInfo");
            }
            catch
            {
                throw new Exception("配置文件的Sheet名称配置错误!");
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    myCommand.Dispose();
                    conn.Dispose();
                }
            }
            DataTable table = myDataSet.Tables["ExcelInfo"].DefaultView.ToTable();
            return table;

            #endregion 读取文件Sheet,转换为DataTable
        }

2.Com组件

非常灵活、完全的操作Excel,精确控制Excel文档的各种属性(储存格式、样式、内容、公式以及条件等),前提是电脑必须安装Excel,会启动Excel进程。程序需要添加引用:Microsoft.Office.Interop.Excel

使用此方式对Excel的基本操作,可参考:C#操作Excel总结

3.NPOI

顾名思义,NPOI是POI项目的.NET版本。POI是一个开源的Java读写Excel、Word等微软OLE2组件文档的项目。此种方式则避免了使用Com组件的缺点,不用在相应的环境机器上安装Office,同时也结合了操作灵活的特点,读取速度也相对较快。

NPOI2.0主要组成:

Assembly名称 模块/命名空间 说明
NPOI.DLL
NPOI.POIFS

OLE2/ActiveX文档属性读写库
NPOI.DLL
NPOI.DDF

微软Office Drawing读写库
NPOI.DLL
NPOI.HPSF

OLE2/ActiveX文档读写库
NPOI.DLL
NPOI.HSSF

微软Excel BIFF(Excel 97-2003, doc)格式读写库
NPOI.DLL
NPOI.SS

Excel公用接口及Excel公式计算引擎
NPOI.DLL
NPOI.Util

基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发
NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式读写库
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式读写库
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底层zip包读写库
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微软Office OpenXml对象关系库

使用NPOI导入Excel如下:

<pre name="code" class="csharp">public static DataTable RenderFromExcel<T>(Stream excelFileStream) where T : new()
{
    using (excelFileStream)
    {
        using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))
        {
            using (ISheet sheet = workbook.GetSheetAt(0))//取第一个表
            {
                DataTable table = new DataTable();
                IRow headerRow = sheet.GetRow(0);//第一行为标题行
                int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells
                int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1
                //定义存取DB字段名称的数组
                String[] strArrayHeader = new String[cellCount - headerRow.FirstCellNum];
                //定义数组所需用的索引值
                int intArrayIndex = 0;
                //handling header.得到Excel导入文件的标题行字符串数组
                for (int i = 0; i < strArrayHeader.Length; i++)
                {
                    strArrayHeader[intArrayIndex] = headerRow.GetCell(i).StringCellValue;
                    ++intArrayIndex;
                }
                //调用方法,将标题行文字描述转换为对应的属性名称
                strArrayHeader = ConfigOperater.QueryImportEntityProperty<T>(strArrayHeader);
                intArrayIndex = 0;
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    //DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                    DataColumn column = new DataColumn(strArrayHeader[intArrayIndex]);
                    table.Columns.Add(column);
                    ++intArrayIndex;
                }
                for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = table.NewRow();
                    if (row != null)
                    {
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            if (row.GetCell(j) != null)
                                dataRow[j] = GetCellValue(row.GetCell(j));
                        }
                    }
                    table.Rows.Add(dataRow);
                }
                return table;
            }
        }
    }
}

总结:

在解析Excel上,三种方式各有千秋,其中NPOI更像是对前面两种方式的中和,让我们在操作Excel的上多了一个选择,还是那句话,没有什么好与不好,只能说是在特定的情况下选择更加适合的方式。

更多资料:

C#操作Excel

NPOI1.2教程

C#读取Excel几种方法的体会

时间: 2024-10-14 18:19:54

C#解析Excel汇总的相关文章

java 解析excel,带合并单元的excel

首先,mavn导入jar包 <!-- 解析excel需要导入的 jar包    begin -->          <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.11</version>        </dep

转:java 解析excel,带合并单元的excel

收集了一些对博主有帮助的博文,如下 >>>>>>>>>>>第一部分: 首先,mavn导入jar包 <!-- 解析excel需要导入的 jar包    begin -->          <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactI

Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传的xls文件(文件格式见下user.xls),解析不为空的行与列,写入数据库. 文件user.xls格式为: 下面来看代码实例演示: 一.前端jsp页面(本来内容很多,这里精简了) <%@ page language="java" contentType="text/htm

Poi解析Excel

Poi解析Excel Poi包里有4个主要的类,包括: Workbook------工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取, Sheet------------表格,Workbook实例的getSheetAt(int num)方法获取, Row--------------行,Sheet实例的getRow(int num)方法获取, Cell--------------单元格,Row实例的getCell(int num)方法获取,

解析Excel文件并把数据存入数据库

前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致总报同一个错,最后在同学的帮助下顺利解决,下面我把自己用"POI"解析的方法总结出来供大家参考(我用的是SpingMVC和hibernate框架). 1.web.xml中的配置文件 web.xml中的配置文件就按照这种方式写,只需要把"application.xml"换

使用POI解析Excel时,出现org.xml.sax.SAXParseException: duplicate attribute &#39;o:relid&#39;的解决办法

1.使用org.apache.poi解析excle,.xlsx类型文件InputStream is = new FileInputStream(strFileName);XSSFWorkbook wb = new XSSFWorkbook(is);出现异常如下: org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetExceptionat org.apache.poi.xssf.usermodel.XSSFFactor

java 解析excel

分析 解析Excel首先就要解析Excel的结构.然后用面向对象的思想分析一下  这是一个excel文件.下面我们就来分析一下如果让你写这个poi框架,那么你会怎么设计. 1. 首先要有一个对象表示这整个Excel文件. 2. 可是这个excel文件中有好多页.Sheet1, Sheet2等等,所以我们还需要一个对象表示页. 3. 在页中,有行,所以还需要一个对象表示行. 4. 在行中,最后细分到格cell. 5. 格cell中数据还有好多类型.有字符串,数字,时间等等. POI中的对象与exc

Apache POI解析Excel文件

1.导入POI的jar包到BOS项目中 2. 使用POI解析Excel文件

POI解析excel的漏洞(CVE-2014-3574)

一.概述 最早的时候,java开发人员在操作excel的时候,用的最多的框架应该是poi.jxl.随着office的不断发展,office2007开始支持openXML的协议,后续陆续出现了新的框架支持操作office,如docx4j等.openXML使得数据的结构.组成更加透明,可以通过一定的操作看到内部完整的结构,如果仔细研究内部的属性,还可以进行更深层次的操作.当然,有利有弊,这也在一定程度上带来了麻烦,因为文件可以随意的更改内部的组成,在一定程度上给相关系统造成麻烦. 二.excel20