发布网友 发布时间:2022-04-19 10:06
共5个回答
懂视网 时间:2022-05-02 15:13
interface IExcelAccess { DataSet Load(ExcelConfig config); }public class ExcelConfig { /// <summary> /// 文件存储路径 /// </summary> public string Path { get; set; } /// <summary> /// 文件表头所在行索引 /// </summary> public int HeaderIndex { get; set; } }
再来看一下使用NPOI的实现:
public class NpoiExcelAccess : IExcelAccess { /// <summary> /// 根据文件扩展名,获取workbook实例 /// </summary> /// <param name="ext"></param> /// <returns></returns> private IWorkbook GetWorkBook(string ext, Stream stream) { IWorkbook workbook = null; switch (ext) { case ".xlsx": workbook = new XSSFWorkbook(stream); break; case ".xls": workbook = new HSSFWorkbook(stream); break; default: break; } return workbook; } /// <summary> /// 加载数据,可设置跳过前几行 /// </summary> /// <param name="path"></param> /// <param name="skipRows"></param> /// <returns></returns> public DataSet Load(ExcelConfig config) { using (var fileStream = new FileStream(config.Path, FileMode.Open, FileAccess.Read)) { var ds = new DataSet(); var ext = Path.GetExtension(config.Path); // 新建IWorkbook对象 var workbook = this.GetWorkBook(ext, fileStream); for (int i = 0; i < workbook.NumberOfSheets; i++) { ISheet sheet = workbook.GetSheetAt(i); DataTable dt = GetDataTable(sheet, config.HeaderIndex); ds.Tables.Add(dt); } return ds; } } private DataTable GetDataTable(ISheet sheet, int headerIndex) { var dt = new DataTable(); // 获取表头行 var headerRow = sheet.GetRow(headerIndex); var cellCount = GetCellCount(sheet, headerIndex); // 设置表头 for (int i = 0; i < cellCount; i++) { if (headerRow.GetCell(i) != null) { dt.Columns.Add(headerRow.GetCell(i).StringCellValue, typeof(string)); } } for (int i = headerIndex + 1; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dr = dt.NewRow(); FillDataRow(row, ref dr); dt.Rows.Add(dr); } dt.TableName = sheet.SheetName; return dt; } private void FillDataRow(IRow row, ref DataRow dr) { if (row != null) { for (int j = 0; j < dr.Table.Columns.Count; j++) { ICell cell = row.GetCell(j); if (cell != null) { switch (cell.CellType) { case CellType.Blank: dr[j] = DBNull.Value; break; case CellType.Boolean: dr[j] = cell.BooleanCellValue; break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { dr[j] = cell.DateCellValue; } else { dr[j] = cell.NumericCellValue; } break; case CellType.String: dr[j] = cell.StringCellValue; break; case CellType.Error: dr[j] = cell.ErrorCellValue; break; case CellType.Formula: // cell = evaluator.EvaluateInCell(cell) as HSSFCell; dr[j] = cell.ToString(); break; default: throw new NotSupportedException(string.Format("Catched unhandle CellType[{0}]", cell.CellType)); } } } } } /// <summary> /// 获取表头列数 /// </summary> /// <param name="sheet"></param> /// <param name="skipRows"></param> /// <returns></returns> private int GetCellCount(ISheet sheet, int headerIndex) { var headerRow = sheet.GetRow(headerIndex); return headerRow.LastCellNum; } }
最后看一下使用OLEDB的实现,这里,我只实现了excel2003的版本,07版本的总是失败,查了原因,是需要在本机安装一个组件才能支持导入.xlsx文件。
public class OleDbExcelAccess : IExcelAccess { private string strConn; public OleDbExcelAccess() { //TODO 需要根据扩展名,来决定 使用哪一种连接字符串 strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = {0};Extended Properties=‘Excel 8.0;IMEX=1;HDR=NO‘"; } public DataSet Load(ExcelConfig config) { var ds = new DataSet(); var sheets = GetSheetNames(config.Path); var strConnTmp = string.Format(strConn, config.Path); foreach (string sheet in sheets) { using (var oleConn = new OleDbConnection(strConnTmp)) { var strsql = "SELECT * FROM [" + sheet + "]"; var oleDaExcel = new OleDbDataAdapter(strsql, oleConn); oleConn.Open(); oleDaExcel.Fill(ds, sheet); } } return ds; } /// <summary> /// 获取Excel的所有的sheet /// </summary> /// <param name="path"></param> /// <returns></returns> private string[] GetSheetNames(string path) { DataTable dt = new DataTable(); if (File.Exists(path)) { string strConnTmp = string.Format(strConn, path); using (var conn = new OleDbConnection(strConnTmp)) { conn.Open(); //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等 dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); } //包含excel中表名的字符串数组 var sheetNames = new List<string>(); for (int k = 0; k < dt.Rows.Count; k++) { string tableName = dt.Rows[k]["TABLE_NAME"].ToString(); //修正出现兼容性视图名称时过滤表名 if (!tableName.Substring(tableName.Length - 1).Equals("_")) { sheetNames.Add(tableName); } } return sheetNames.ToArray(); } return null; } }
最后看一下客户端的调用 :
private void TestExcelImport() { var excelFile = Path.Combine("C:\Users\hankk\Desktop\ICON", "2003版本.xls"); ExcelConfig config = new ExcelConfig() { Path = excelFile, HeaderIndex = 1 }; IExcelAccess npoiAccess = new NpoiExcelAccess(); var npoiDs = npoiAccess.Load(config); IExcelAccess oleDbAccess = new OleDbExcelAccess(); var oleDs = oleDbAccess.Load(config); }
代码已上传到github: https://github.com/hankuikuide/ExcelAccessor
Excel转化成DataTable实现:NPOI和OLEDb
标签:book error sub mat ada [] 实例 add bin
热心网友 时间:2022-05-02 12:21
excel释义
Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。
直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使Excel成为最流行的个人计算机数据处理软件。
在1993年,作为Microsoft Office的组件发布了5.0版之后,Excel就开始成为所适用操作平台上的电子制表软件的霸主。
excel函数
在 Excel中,函数实际上是一个预先定义的特定计算公式。
按照这个特定的计算公式对一个或多个参数进行计算,并得出一个或多个计算结果,叫做函数值。使用这些函数不仅可以完成许多复杂的计算,而且还可以简化公式的繁杂程度。
简介
为了满足各种数据处理的要求,Excel提供了大量函数供用户使用,函数是系统预先编制好的用于数值计算和数据处理的公式,使用函数可以简化或缩短工作表中的公式,使数据处理简单方便。
Excel 2003提供了丰富的函数,如财务函数、日期与时间函数、数值与三角函数、统计函数、查找与引用函数、数据库函数、文字函数、逻辑函数、信息函数等。
热心网友 时间:2022-05-02 13:39
excel
[英][ɪk'sel][美][ɪkˈsɛl]
vt.优于,擅长;
vi.胜过;
Microsoft Excel是微软公司的办公软件Microsoft office的组件之一,是由Microsoft为Windows和Apple Macintosh操作系统的电脑而编写和运行的一款试算表软件。Excel 是微软办公套装软件的一个重要的组成部分,它可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经、金融等众多领域。
热心网友 时间:2022-05-02 15:14
付费内容限时免费查看回答释义:
vt. 超过;擅长
vi. (在某方面)胜过(或超过)别人
例句:
No one knows what this mysterious person excels in.
没人知道这个神秘人擅长什么。
词组:
excel inv. 在……方面胜过;在……方面很擅长
excel at突出;擅长于
很多人在办公或学习的时候,经常使用到EXCEL电子表格。 那么,您知道电子表格中的EXCEL这个名称,代表什么意思吗? 下面我给您介绍介绍EXCEL这个名称的缘由。 excel不是什么单词的缩写,它本身就是一个单词,不过却是由excellent引申而来的。 EXCEL单词的含义是:优秀的、擅长于、胜于、优于…… 微软公司Microsoft的电子表格,取名为EXCEL,就说明了,微软公司Microsoft自认为EXCEL电子表格是很优秀的。 或者可以这样来理解,微软的人认为,他们的电子表格,优于其它电子表格、胜于其它电子表格,暗示他们的电子表格是最优秀的。因为优于其它人的、胜于其它人的,那么,还有谁能比得过他们的呢? EXCEL不仅代表了微软公司Microsoft对电子表格的研发
热心网友 时间:2022-05-02 17:05
&是连接符 如a1&a2 则将两个单元格连接起来 ""在excel里面表示空值的意思
在excel中一般用到""基本上都是要进行逻辑判断的,在各种程序设计也是这样的。注意单元格是格式是智能的,默认为数值格式,在数值格式中的没有就是0
你参加运算 0&""或者0+0&"" 将这个连接起来看到的还是0。
还有:""也可以表示输入文本 比如在vba代码当中cells(1,1)="你好" 或者cells(1,1)="123"这样都表示文本输入 则 A1单元格的123也就变成文本格式了 。实际上""就是英文的两个引号,引号中间的就是引用文本 中间没有就表示空值(没有)中间空一格 ,如=0&" "&0 结果就是0 0 这样显示的。
如果你逻辑判断一下就不同了,比如:=if((A1+B1)&""=0,"",((A1+B1)&"")这样就返回空值了。