系列文章

C#底层库–记录日志帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709

C#底层库–MySQL脚本自动构建类(insert、update语句生成)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216

C#底层库–MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379

C#底层库–XML配置参数读写辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129175304

C#底层库–获取文件版本和MD5值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

C#底层库–操作文件帮助类FileHelper(获取目录的所有文件)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887161

C#底层库–操作Excel帮助类(读取、导出表格)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887445

C#底层库–随机数生成类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126888812

C#底层库–正则表达式帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286

C#底层库–CSV和DataTable相互转换
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128804367

C#底层库–Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298

C#底层库–JSON帮助类_详细(序列化、反序列化、list、datatable)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805705

C#底层库–cookie操作辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816347

C#底层库–Session操作辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817096

C#底层库–数据实体类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

C#底层库–Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298

C#底层库–数据库类型与程序类型转换类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817610

C#底层库–日期扩展类(上周、本周、明年、前年等)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

文章目录

  • 系列文章
  • 前言
  • 一、底层库介绍
  • 二、底层库源码
    • 2.1 Excel读取方式
    • 2.2 Excel表格读取
  • 三、调用方法
  • 四、运行案例
  • 五、资源链接

前言

本专栏为【底层库】,主要介绍编程过程中 通用函数。我们将这些通用固化的源码,进行重写、封装、拓展,再进行单元测试、集成测试、beta测试,最终形成通用化模板,这里我们称为“底层库”。

作为研发人员的你,并不需要花大量时间,研究“底层库”的含义,及“底层库”的实现方法。你只需要几行调用代码,就可以解决项目上碰到的难题。而底层库使用方法,本专栏均有详细介绍,也有项目应用场景。

底层库已实现功能:MySQL脚本构建器、MySQL数据库访问操作、参数配置文件读写、加解密算法、日志记录、HTTP通信、Socket通信、API前后端交互、邮件发送、文件操作、配置参数存储、Excel导入导出、CSV和DataTable转换、压缩解压、自动编号、Session操作等。

本专栏会持续更新,不断优化【底层库】,大家有任何问题,可以私信我。本专栏之间关联性较强(我会使用到某些底层库,某些文章可能忽略介绍),如果您对本专栏感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。

一、底层库介绍

Excel操作帮助类,解决方法是读取Excel表格数据转换成通用的DataTable,方便开发人员进行处理。
通俗的说,使用本底层库,你将无需知道“Excel读取是如何实现的?”、“Excel版本问题(.xls、.xlsx)?”、“Excel加密了怎么办?”等一系列复杂问题。
可以参照【调用方法】章节的案列,模仿着写一下调用代码,你将获得一个DataTable,你可以对DataTable进行foreach遍历;可以对DataTable进行硬存储即数据库存储(需结合本专栏SQL构造库使用);可以做通用选择、下拉选择等。

二、底层库源码

2.1 Excel读取方式

关于读取Excel有三种方式:
①微软提供的组件Microsoft.Office.Interop.Excel读取。
②采用NPOI组件读取,这是广大网友采用的方式,但是有局限性
③采用select查询方式,限制太多,已经过时,本文不采用不做介绍。
提示:两种方式均可以,其中方法①资源占用大、速度慢;方法②资源占用小、速度快。那我为何仍旧给出方法①呢?是因为如果是保密单位,公司电脑上安装有加密软件的,会对文档进行加密,方法②读取Excel表格会失败。而由于方法①采用office自带的开放式组件,是能够正常读取文档的,前提是你正确安装了office、WPS,并且安装时勾选了“开放可编程组件”,如果其实就是需要组件支持。

小白可能无法理解,保密单位为啥Excel文档要加密呢?刚我公司为保密单位,我这里有个现成的案例。

仔细看“红色方框”的Excel,图标上有一个小锁标记,表明此文件是加密的,你只有在公司内网环境下可以正常打开,你拿到外网或者你自己的设备上是打不开文件的,打开只是一堆乱码。
但是问题来了,我们开发的软件要适用任何环境,就是即使拿到外网环境,我也要能够读取Excel的内容,这就是我们方法①的区别。

2.2 Excel表格读取

我们将Excel表格转换为DataTable,方便程序操作。创建类ExcelHelper.cs,复制以下代码:

using System;
using System.IO;
using System.Data;
using System.Diagnostics;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using Microsoft.Office.Interop.Excel;namespace ExcelImportTool
{/// <summary>/// Excel操作类/// </summary>/// Microsoft Excel 11.0 Object Librarypublic class ExcelHelper{/// <summary>/// 读取Excel加密文件(可以读加密文件,性能低)/// </summary>/// <param name="excelFilePath"></param>/// <returns></returns>public System.Data.DataTable ExcelToDataTableWhithEncryp(string excelFilePath){Application app = new Application();Sheets sheets;Workbook workbook = null;object oMissiong = System.Reflection.Missing.Value;System.Data.DataTable dt = new System.Data.DataTable();try{if (app == null){return null;}workbook = app.Workbooks.Open(excelFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);//将数据读入到DataTable中——Startsheets = workbook.Worksheets;Worksheet worksheet = (Worksheet)sheets.get_Item(1);//读取第一张表if (worksheet == null)return null;string cellContent;int iRowCount = worksheet.UsedRange.Rows.Count; //最大行数int iColCount = worksheet.UsedRange.Columns.Count; //最大列数Range range;//负责列头StartDataColumn dc;//列序号int ColumnID = 1;range = (Range)worksheet.Cells[1, 1];while (!string.IsNullOrEmpty(range.Text.ToString().Trim())){dc = new DataColumn();dc.DataType = System.Type.GetType("System.String");dc.ColumnName = range.Text.ToString().Trim();dt.Columns.Add(dc);range = (Range)worksheet.Cells[1, ++ColumnID];}//有效数据列,因为Excel文档导出的数据,有很多空白列要去除。iColCount = ColumnID-1;for (int iRow = 2; iRow <= iRowCount; iRow++) //行循环{DataRow dr = dt.NewRow();string l_strRow = "";//行数据for (int iCol = 1; iCol <= iColCount; iCol++) //列循环{range = (Range)worksheet.Cells[iRow, iCol];cellContent = (range.Value2 == null) ? "" : range.Text.ToString();l_strRow = cellContent;dr[iCol - 1] = cellContent;}//行都是空数据跳出,因为Excel文档导出的数据,有很多空白行要去除。if (string.IsNullOrEmpty(l_strRow.Trim())) {break;}dt.Rows.Add(dr);}//将数据读入到DataTable中——Endreturn dt;}catch(Exception ex){Console.WriteLine("异常: " + ex.Message);return null;}finally{workbook.Close(false, oMissiong, oMissiong);System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);workbook = null;app.Workbooks.Close();app.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(app);app = null;GC.Collect();GC.WaitForPendingFinalizers();}}/// <summary>/// 读取Excel非加密文件(仅支持未加密,性能快)/// </summary>/// <param name="fileName"></param>/// <param name="sheetName"></param>/// <param name="isFirstRowColumn"></param>/// <returns></returns>public System.Data.DataTable ExcelToDataTable(string fileName, string sheetName = null, bool isFirstRowColumn = true){FileStream fs = null;ISheet sheet = null;System.Data.DataTable data = new System.Data.DataTable();IWorkbook workbook = null;int startRow = 1;try{fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);if (fileName.IndexOf(".xlsx") > 0) // 2007版本workbook = new XSSFWorkbook(fs);else if (fileName.IndexOf(".xls") > 0) // 2003版本workbook = new HSSFWorkbook(fs);if (sheetName != null){sheet = workbook.GetSheet(sheetName);if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet{sheet = workbook.GetSheetAt(0);}}else{sheet = workbook.GetSheetAt(0);}if (sheet != null){IRow firstRow = sheet.GetRow(0);//读取标题int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数if (isFirstRowColumn){for (int i = firstRow.FirstCellNum; i < cellCount; ++i){NPOI.SS.UserModel.ICell cell = firstRow.GetCell(i);if (cell != null){// cell.SetCellType(CellType.String);string cellValue = cell.StringCellValue;if (cellValue != null){DataColumn column = new DataColumn(cellValue);data.Columns.Add(column);}}}startRow = sheet.FirstRowNum + 1;}else{startRow = sheet.FirstRowNum;}//最后一列的标号int rowCount = sheet.LastRowNum;for (int i = startRow; i <= rowCount; ++i){IRow row = sheet.GetRow(i);if (row == null) continue; //没有数据的行默认是null       DataRow dataRow = data.NewRow();for (int j = row.FirstCellNum; j < cellCount; ++j){if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null{dataRow[j] = row.GetCell(j).ToString();}}data.Rows.Add(dataRow);}}return data;}catch (Exception ex){Console.WriteLine("异常: " + ex.Message);return null;}}}
}

三、调用方法

我放在了新窗体页面,选择文件路径,将表格的数据直接转换成DataTable,并且绑定数据表。

        private void FormImport_Load(object sender, EventArgs e){ExcelHelper excelHelper = new ExcelHelper();GC_Main.DataSource = excelHelper.ExcelToDataTableWithEncryption(m_strFilePath);}

这里我们可以遍历DataTable,构造成Json数据,将数据提交到服务端进行保存操作。

  private void IBTN_Save_Click(object sender, EventArgs e){bool l_bSucess = false;DataTable l_dt = GC_Main.DataSource as DataTable;foreach (DataRow dr in l_dt.Rows){MXModel model = new MXModel{日期 = dr["日期"].ToString(),原料编号 = dr["原料编号"].ToString(),原料规格 = dr["原料规格"].ToString(),原料强度 = dr["原料强度"].ToString(),黄丝厂家 = dr["黄丝厂家"].ToString(),黄丝代码 = dr["黄丝代码"].ToString(),doff = dr["doff"].ToString(),班组 = dr["班组"].ToString(),班次 = dr["班次"].ToString(),母线盘编号 = dr["母线盘编号"].ToString(),车台号 = dr["车台号"].ToString(),规格 = dr["规格"].ToString(),ABC质量等级 = dr["ABC质量等级"].ToString(),ABC质量描述 = dr["ABC质量描述"].ToString(),ABC质量类型 = dr["ABC质量类型"].ToString(),下盘直径 = dr["下盘直径"].ToString(),下盘椭圆度 = dr["下盘椭圆度"].ToString(),下盘圈径 = dr["下盘圈径"].ToString(),下盘翘头 = dr["下盘翘头"].ToString(),下盘操作工 = dr["下盘操作工"].ToString(),成品模编码 = dr["成品模编码"].ToString(),长度 = dr["长度(M)"].ToString(),实际定长 = dr["实际定长"].ToString(),下盘累积换模长度 = dr["下盘累积换模长度(KM)"].ToString(),第几盘 = dr["第几盘"].ToString(),开机速度 = dr["开机速度"].ToString(),上盘操作工 = dr["上盘操作工"].ToString(),开机直径 = dr["开机直径"].ToString(),开机椭圆度 = dr["开机椭圆度"].ToString(),开机圈径 = dr["开机圈径"].ToString(),开机翘头 = dr["开机翘头"].ToString(),开机领班 = dr["开机领班"].ToString(),开机班次 = dr["开机班次"].ToString(),工艺代码 = dr["工艺代码"].ToString(),试验代码 = dr["试验代码"].ToString(),钻石模具代码 = dr["钻石模具代码"].ToString(),钨钢模具代码 = dr["钨钢模具代码"].ToString(),定长 = dr["定长"].ToString(),BC原因分析 = dr["BC原因分析"].ToString(),物理退回原因 = dr["物理退回原因"].ToString(),设备 = dr["设备"].ToString(),工字轮类型 = dr["工字轮类型"].ToString(),表面质量 = dr["表面质量"].ToString(),备注 = dr["备注"].ToString(),删除 = "0"};string l_strMXSave = JsonConvert.SerializeObject(model);string l_strReturn = HttpHelper.HttpPost(string.Format(Const.ct_strSaveDataMX, AppConfig.GetValue("db_server")), l_strMXSave);ActionResult Result = JsonConvert.DeserializeObject<ActionResult>(l_strReturn);if (Result.RetInfo.IsSUCD){l_bSucess = true;continue;}else{l_bSucess = false;XtraMessageBox.Show(Result.RetInfo.ErrorCode + ":" + Result.RetInfo.ErrorMsg,"错误", MessageBoxButtons.OK, MessageBoxIcon.Error);break;}}if (l_bSucess){DialogResult = DialogResult.OK;}else{DialogResult = DialogResult.No;}}

四、运行案例

我的项目是做了一个Excel数据导入的功能,现将Excel数据导入到页面上,其次点击保存按钮写到数据库中。
右键菜单“导入Excel”,选择导入的文件。

Excel表格数据读取到窗体界面上,可以对数据进行检查、变更、核对。

数据没有问题进行“保存”操作,我这里将数据提交到服务器端进行保存处理,客户端不进行处理操作。

五、资源链接

我这里提供一个Excel数据导入工具,采用以上底层库开发,可用于【基础数据初始化】

链接:https://pan.baidu.com/s/172naooddftXYMORUTaSNsw?pwd=0cmp
提取码:0cmp

C#底层库--操作Excel帮助类(读取、导出表格)相关推荐

  1. EpPlus读取生成Excel帮助类+读取csv帮助类+Aspose.Cells生成Excel帮助类

    大部分功能逻辑都在,少量自定义异常类和扩展方法 ,可用类似代码自己替换 //EpPlus读取生成Excel帮助类+读取csv帮助类,epplus只支持开放的Excel文件格式:xlsx,不支持 xls ...

  2. java 操作excel的类_探究下Java操作Excel的几类工具

    引言 java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI ...

  3. hssfwork 导出excel 文件已损坏_C# NPOI 操作EXCEL文件的读取和导出

    在实际项目中有很多场景遇到需要操作EXCEL文件,而常用到的库就有NPOI:NPOI是开源的POI 项目的.NET版,POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目, ...

  4. 自己封装的poi操作Excel工具类

    在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.汇总Exc ...

  5. 操作Excel工具类:ExcelUtils.java

    项目中,时常会需要导入导出Excel的需求,因此我专门花时间设计了工具类. 所需依赖 <!-- 处理xls或xlsx格式的Excel表格导入导出的依赖 --><dependency& ...

  6. [原创]C# 操作Excel的类

    最近领导要求把一些数导入Excel生成报表, 工作本来是要手动完成的,但咱是做程序的, 应该想一切办法让程序来代替我们完成任务, 于是写了一个操作Excel的程序, 现将代码公布, 希望对读本文的朋友 ...

  7. Java操作Excel工具类

    Excel工具类 要说的话 长期作为一个c/v工程师,搞了很久但是感觉还是比较空虚,正好最近又在弄Excel相关的东西,然后就基于POI封装了一个比较简单易用的工具类.在这之前,本人水平一般般,还希望 ...

  8. C#操作Excel ExcelHelper类(Excel2007)

    http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html 上面没有读取Excel文件的方法,补充一个: View Code ...

  9. openpyxl库操作excel表格

    1.打开excel表格 import openpyxl # 导入模块wb = openpyxl.load_workbook('ce.xlsx') # 打开对应ce.xlsx文档 wb = openpy ...

最新文章

  1. 设计模式之观察者模式(Observer)摘录
  2. pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据、其中多列索引需要嵌入在列表方括号[]中、或使用:符号形成起始和终止范围索引
  3. samba+quota配置
  4. linux下必看的60个命令
  5. Satori变种正在通过替换钱包地址盗取ETH数字代币
  6. arraylist 初始化_ArrayList实现原理(JDK1.8)
  7. python列表添加字符串_2.python基础之—列表,元组,字典,集合,字符串的使用方法...
  8. css3实现的the Sexy Buttons
  9. javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
  10. Python获取日期列表中每一天中最大的时刻对应的日期时间戳
  11. .Net大型购物平台源码
  12. 学计算机基础的重要性,浅谈学习计算机基础知识的重要性.pdf
  13. 硬盘突然变raw格式_硬盘突然变成RAW格式解决办法
  14. 升降压斩波电路matlab,升降压斩波电路matlab仿真
  15. 关闭win10任务视图功能
  16. android微信分享怎么自定义样式,微信更新!主题皮肤终于支持自定义了,样式超多有个性...
  17. 全国各地省市地区plist文件(数据跟微信的地区一致)
  18. 【论文笔记】基于生成对抗网络的强化学习算法的研究
  19. 语音识别引擎接口 将声音转换为文字显示
  20. 第六篇:R语言数据可视化之数据分布图(直方图、密度曲线、箱线图、等高线、2D密度图)

热门文章

  1. ES 词库热更新(实现方式一:远程词库)
  2. 制衣毛织企业上ERP系统浅谈之:我要的是什么?
  3. U盘无法格式化:windows无法完成格式化
  4. (附源码)springboot员工日志管理信息系统的设计与开发 毕业设计201834
  5. 智慧数字书法教室整体解决方案(设计、建设及设备全套)
  6. 简单光照模型(Lambert 光照模型)
  7. 事件:onblur()无限触发问题
  8. python海龟绘图五角星
  9. 中国亲戚关系图 被称“回家过年必备”
  10. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated解决