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

系列文章

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

C#底层库–数据库访问帮助类(MySQL版)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379

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#底层库–软件版本管理XML
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110195766

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

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

文章目录

  • 系列文章
  • 前言
  • 一、底层库介绍
  • 二、底层库源码
    • 2.1 将Excel表格转换成DataTable
  • 三、调用方法
  • 四、运行效果


前言

本文将新增一个专栏–底层库,分享编程过程中常用的方法函数。我们将这些常用的方法函数,进行封装,反复测试,形成通用化类库。
方便研发人员,只需要几行代码就可以使用它,解决一些难点问题。
底层库的封装涉及到:数据库操作、加解密算法、日志记录、网络通信、邮件发送、文件操作、参数保存、Excel导入导出等等,持续关注本专栏吧。大家有任何问题,也可以评论区反馈,私信我。

一、底层库介绍

Excel操作帮助类,解决思路是将Excel表格转换成通用的DataTable,方便开发人员进行处理。
通俗的说,使用我们的底层库,你将无需知道“Excel读取是如何实现的?”、“Excel低版本能否读取?”等一系列复杂问题。可以参照【调用方法】章节的案列,获得一个DataTable,你可以对DataTable进行foreach遍历;可以对DataTable进行数据库保存(需结合本专栏SQL构造库使用);可以做通用选择、下拉选择等。

二、底层库源码

2.1 将Excel表格转换成DataTable

关于读取Excel提供两种常用方式:
①微软提供的组件Microsoft.Office.Interop.Excel
②采用NPOI组件读取
提示:两种方式均可以,其中方法①资源占用大、速度慢;方法②资源占用小、速度快。那我为何仍旧给出方法①呢?是因为方法如果是保密单位,公司电脑上安装有加密软件的,会对文档进行加密,方法②读取Excel表格会失败。而由于方法①采用office自带的开放式组件,是能够正常读取文档的,前提是你正确安装了office、WPS,并且安装时勾选了“开放可编程组件”

创建类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 QRCodeProduce
{
    /// 
    /// Excel操作类
    /// 
    /// Microsoft Excel 11.0 Object Library
    public class ExcelHelper
    {
        /// 
        /// 读取Excel文件(加密)
        /// 
        /// Excel表格的路径
        /// 
        public System.Data.DataTable ExcelToDataTableWithEncryption(string a_excelPath)
        {
            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(a_excelPath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);

                //将数据读入到DataTable中——Start

                sheets = 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;

                //负责列头Start
                DataColumn 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];
                }
                //End

                for (int iRow = 2; iRow <= iRowCount; iRow++)
                {
                    DataRow dr = dt.NewRow();

                    for (int iCol = 1; iCol <= iColCount; iCol++)
                    {
                        range = (Range)worksheet.Cells[iRow, iCol];

                        cellContent = (range.Value2 == null) ? "" : range.Text.ToString();

                        dr[iCol - 1] = cellContent;
                    }

                    dt.Rows.Add(dr);
                }

                //将数据读入到DataTable中——End
                return dt;
            }
            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }
            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();
            }
        }

        /*
        /// 
        /// 读取Excel文件(未加密)
        /// 
        /// 
        /// 
        /// 
        /// 
        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)
                        {
                            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”
C#底层库--操作Excel帮助类(读取、导出表格)_第1张图片
Excel表格数据读取到窗体界面上,可以对数据进行检查、变更、核对。
C#底层库--操作Excel帮助类(读取、导出表格)_第2张图片
数据没有问题进行“保存”操作,我这里将数据提交到服务器端进行保存处理,客户端不进行处理操作。

你可能感兴趣的:(底层库(工具,通用类),c#,表格导入,表格导出,Excel)