热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#DataGridview用NPOI导出Excel文件

导出excel我用的是nuget的NPOI,直接在项目中添加的,引用到项目中,下面是截图: 下面我把ExcelHelper贴出来publicstaticclassExcelHelp

导出excel我用的是nuget 的NPOI,直接在项目中添加的,引用到项目中,下面是截图:

C# DataGridview用NPOI导出Excel文件

 

下面我把ExcelHelper贴出来

    public static class ExcelHelper
    {
        public static void ExportToExcel(DataTable dt)
        {
            ExportToExcelData(dt);
        }
    
public static DataTable ToDataTable(this DataGridView myDGV) { DataTable dt = new DataTable(); for (int i = 0; i ) { dt.Columns.Add(myDGV.Columns[i].HeaderText); } //写入数值 for (int r = 0; r ) { List<object> values = new List<object>(); for (int i = 0; i ) { values.Add(myDGV.Rows[r].Cells[i].Value); } dt.Rows.Add(values .ToArray()); } return dt; } #region 导出 /// /// 数据导出 /// /// /// public static void ExportToExcelData(this DataTable data) { ExportToExcel(data, "Sheet1"); } /// /// 数据导出 /// /// /// public static void ExportToExcel(this DataTable data, string sheetName) { SaveFileDialog fileDialog = new SaveFileDialog(); //fileDialog.Filter = "Excel(97-2003)|*.xls|Excel(2007-2013)|*.xlsx"; fileDialog.Filter = "Excel|*.xls|Excel|*.xlsx"; if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) { return; } IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); IRow rowHead = sheet.CreateRow(0); //填写表头 for (int i = 0; i ) { rowHead.CreateCell(i, CellType.String).SetCellValue(data.Columns[i].ColumnName.ToString()); } //填写内容 for (int i = 0; i ) { IRow row = sheet.CreateRow(i + 1); for (int j = 0; j ) { row.CreateCell(j, CellType.String).SetCellValue(data.Rows[i][j].ToString()); } } for (int i = 0; i ) { sheet.AutoSizeColumn(i); } using (FileStream stream = File.OpenWrite(fileDialog.FileName)) { workbook.Write(stream); stream.Close(); } MessageBox.Show("导出数据成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); GC.Collect(); } #endregion #region 导入 /// /// 导入的文件名 /// /// /// public static DataSet ExcelToDataSet(string fileName) { return ExcelToDataSet(fileName, true); } /// /// 返回dataset /// /// /// /// public static DataSet ExcelToDataSet(string fileName, bool firstRowAsHeader) { int sheetCount = 0; return ExcelToDataSet(fileName, firstRowAsHeader, out sheetCount); } /// /// 返回dataset /// /// 文件名 /// 文件头 /// 内容 /// public static DataSet ExcelToDataSet(string fileName, bool firstRowAsHeader, out int sheetCount) { using (DataSet ds = new DataSet()) { using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = WorkbookFactory.Create(fileStream); IFormulaEvaluator evaluator = WorkbookFactory.CreateFormulaEvaluator(workbook); sheetCount = workbook.NumberOfSheets; for (int i = 0; i i) { ISheet sheet = workbook.GetSheetAt(i); DataTable dt = ExcelToDataTable(sheet, evaluator, firstRowAsHeader); ds.Tables.Add(dt); } return ds; } } } /// /// 返回DataTable /// /// /// /// /// private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator, bool firstRowAsHeader) { if (firstRowAsHeader) { return ExcelToDataTableFirstRowAsHeader(sheet, evaluator); } else { return ExcelToDataTable(sheet, evaluator); } } private static DataTable ExcelToDataTableFirstRowAsHeader(ISheet sheet, IFormulaEvaluator evaluator) { try { using (DataTable dt = new DataTable()) { IRow firstRow = sheet.GetRow(0); int cellCount = GetCellCount(sheet); for (int i = 0; i ) { if (firstRow.GetCell(i) != null) { dt.Columns.Add(firstRow.GetCell(i).StringCellValue ?? string.Format("F{0}", i + 1), typeof(string)); } else { dt.Columns.Add(string.Format("F{0}", i + 1), typeof(string)); } } for (int i = 1; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dr = dt.NewRow(); FillDataRowByRow(row, evaluator, ref dr); dt.Rows.Add(dr); } dt.TableName = sheet.SheetName; return dt; } } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } } private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator) { using (DataTable dt = new DataTable()) { if (sheet.LastRowNum != 0) { int cellCount = GetCellCount(sheet); for (int i = 0; i ) { dt.Columns.Add(string.Format("F{0}", i), typeof(string)); } for (int i = 0; i i) { DataRow dr = dt.NewRow(); dt.Rows.Add(dr); } for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dr = dt.NewRow(); FillDataRowByRow(row, evaluator, ref dr); dt.Rows.Add(dr); } } dt.TableName = sheet.SheetName; return dt; } } /// /// 填充数据 /// /// /// /// private static void FillDataRowByRow(IRow row, IFormulaEvaluator evaluator, ref DataRow dr) { if (row != null) { for (int j = 0; 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("Unsupported format type:{0}", cell.CellType)); } } } } } /// /// 获取单元格 /// /// /// private static int GetCellCount(ISheet sheet) { int firstRowNum = sheet.FirstRowNum; int cellCount = 0; for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; ++i) { IRow row = sheet.GetRow(i); if (row != null && row.LastCellNum > cellCount) { cellCount = row.LastCellNum; } } return cellCount; } #endregion }

如果DataGridview的数据源有多余的列,我们可以用扩展方法,把dataGridView转成DataTable,ExcelHelper中有,但是我拿出来,需要自己注意下。

     
        /// 
        /// DataGridView转DataTable的扩展方法
        /// 
        /// 
        /// 
        public static DataTable ToDataTable(this DataGridView myDGV)
        {
            DataTable dt = new DataTable();
            for (int i = 0; i )
            {
                dt.Columns.Add(myDGV.Columns[i].HeaderText);
            }
            //写入数值
            for (int r = 0; r )
            {
                List<object> values = new List<object>();
                for (int i = 0; i )
                {
                    values.Add(myDGV.Rows[r].Cells[i].Value);
                }
                dt.Rows.Add(values .ToArray());
            }
            return dt;
        }
        #endregion

导出按钮事件,可以直接写:

   if (dgBoxInData.Rows.Count > 0)
                {
                    ExcelHelper.ExportToExcel(dgBoxInData.ToDataTable());//Run
                }

 


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文介绍了两种方法,用于检测 Android 设备是否开启了开发者模式。第一种方法通过检查 USB 调试模式的状态,第二种方法则直接判断开发者选项是否启用。这两种方法均提供了代码示例和详细解释。 ... [详细]
author-avatar
mobiledu2502876293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有