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

下面我把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 = ; i < myDGV.ColumnCount; i++)
{
dt.Columns.Add(myDGV.Columns[i].HeaderText);
}
//写入数值
for (int r = ; r < myDGV.Rows.Count; r++)
{
List<object> values = new List<object>();
for (int i = ; i < myDGV.ColumnCount; i++)
{
values.Add(myDGV.Rows[r].Cells[i].Value);
}
dt.Rows.Add(values .ToArray());
}
return dt;
}
#region 导出
/// <summary>
/// 数据导出
/// </summary>
/// <param name="data"></param>
/// <param name="sheetName"></param>
public static void ExportToExcelData(this DataTable data)
{
ExportToExcel(data, "Sheet1");
}
/// <summary>
/// 数据导出
/// </summary>
/// <param name="data"></param>
/// <param name="sheetName"></param>
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(); //填写表头
for (int i = ; i < data.Columns.Count; i++)
{
rowHead.CreateCell(i, CellType.String).SetCellValue(data.Columns[i].ColumnName.ToString());
}
//填写内容
for (int i = ; i < data.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + );
for (int j = ; j < data.Columns.Count; j++)
{
row.CreateCell(j, CellType.String).SetCellValue(data.Rows[i][j].ToString());
}
} for (int i = ; i < data.Columns.Count; 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 导入
/// <summary>
/// 导入的文件名
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static DataSet ExcelToDataSet(string fileName)
{
return ExcelToDataSet(fileName, true);
}
/// <summary>
/// 返回dataset
/// </summary>
/// <param name="fileName"></param>
/// <param name="firstRowAsHeader"></param>
/// <returns></returns>
public static DataSet ExcelToDataSet(string fileName, bool firstRowAsHeader)
{
int sheetCount = ;
return ExcelToDataSet(fileName, firstRowAsHeader, out sheetCount);
}
/// <summary>
/// 返回dataset
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="firstRowAsHeader">文件头</param>
/// <param name="sheetCount">内容</param>
/// <returns></returns>
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 = ; i < sheetCount; ++i)
{
ISheet sheet = workbook.GetSheetAt(i);
DataTable dt = ExcelToDataTable(sheet, evaluator, firstRowAsHeader);
ds.Tables.Add(dt);
}
return ds;
}
}
}
/// <summary>
/// 返回DataTable
/// </summary>
/// <param name="sheet"></param>
/// <param name="evaluator"></param>
/// <param name="firstRowAsHeader"></param>
/// <returns></returns>
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();
int cellCount = GetCellCount(sheet); for (int i = ; i < cellCount; i++)
{
if (firstRow.GetCell(i) != null)
{
dt.Columns.Add(firstRow.GetCell(i).StringCellValue ?? string.Format("F{0}", i + ), typeof(string));
}
else
{
dt.Columns.Add(string.Format("F{0}", i + ), typeof(string));
}
} for (int i = ; 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 != )
{
int cellCount = GetCellCount(sheet); for (int i = ; i < cellCount; i++)
{
dt.Columns.Add(string.Format("F{0}", i), typeof(string));
} for (int i = ; i < sheet.FirstRowNum; ++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;
}
}
/// <summary>
/// 填充数据
/// </summary>
/// <param name="row"></param>
/// <param name="evaluator"></param>
/// <param name="dr"></param>
private static void FillDataRowByRow(IRow row, IFormulaEvaluator evaluator, ref DataRow dr)
{
if (row != null)
{
for (int j = ; 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("Unsupported format type:{0}", cell.CellType));
}
}
}
}
} /// <summary>
/// 获取单元格
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
private static int GetCellCount(ISheet sheet)
{
int firstRowNum = sheet.FirstRowNum; int cellCount = ; 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中有,但是我拿出来,需要自己注意下。

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

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

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

C# DataGridview用NPOI导出Excel文件的更多相关文章

  1. 使用NPOI导出Excel文件

    使用NPOI导出Excel文件,本实例使用了ASP.NET MVC. 1.使用NPOI导出Excel文件 实例:导出商品列表. 要求:1.通过NPOI导出导出商品列表信息: 2.使用Excel函数计算 ...

  2. 关于NPOI导出excel文件(xls和xlsx两种格式)提示格式不符的问题

    这两天在做导出excel文件的时候遇到这个问题 本来我导出的格式是xlsx格式的,但是下载得到的文件格式变成了xls, 一开始以为是返回的contenttype设置错了 return File(ms, ...

  3. 基于Vue + axios + WebApi + NPOI导出Excel文件

    一.前言 项目中前端采用的Element UI 框架, 远程数据请求,使用的是axios,后端接口框架采用的asp.net webapi,数据导出成Excel采用NPOI组件.其业务场景,主要是列表页 ...

  4. C# 未安装Office环境下使用NPOI导出Excel文件

    1.NuGet直接安装NPOI程序包: 2. using NPOI.XSSF.UserModel; 3.导出Excel代码: private void TsbExport2ExcelClick(obj ...

  5. asp.net Mvc 使用NPOI导出Excel文件

    1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...

  6. 使用 NPOI 导出 Excel 文件

    [NPOI简介] NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者 ...

  7. NPOI导出Excel文件,对单元格的一些设置

    HSSFWorkbook book = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); ISheet sheet = book.Cr ...

  8. DataGridView如何快速导出Excel

    从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...

  9. c# datagridview导出Excel文件 问题

    今天vs2010c#开发做datagridview导出Excel文件时,发现一个问题,和大家探讨一下: 第一种方式:写流的方式 private void button_Excel_Click(obje ...

随机推荐

  1. Flow类中的resolveBreaks与resolveContinues

    /** Resolve all continues of this statement. */ boolean resolveContinues(JCTree tree) { boolean resu ...

  2. 《垃圾回收的算法与实现》——GC标记-清除算法

    基本算法 标记-清除算法由 ==标记阶段== 和 ==清除阶段== 构成. 标记即将所有活动的对象打上标记. 清除即将那些没有标记的对象进行回收. 标记与清除 遍历GC root引用,递归标记(设置对 ...

  3. 用sinopia搭建内部npm服务

    sinopia搭建 这里默认你已经有node环境了,执行下面命令,全局安装 sinopia npm install -g sinopia 安装好后,执行下面命令启动 sinopia sinopia 你 ...

  4. SpringMVC访问WEB-INF下的jsp的方法

    当输入localhost:8080/项目名 浏览器弹出不知道神马错误 The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res ...

  5. Integer.parseInt() 和 valueOf()

    parseInt("1")返回的是int类型,所以如果想要将一个String类型的数字串转为原始类型int ,建议使用这个方法, 而不是使用 valueOf("1&quo ...

  6. Linux中终端和控制台的一些不成熟的理解

    首先声明,这仅仅是在下一些不成熟的想法.是通过看网上的一些资料和自己实践的一些心得,应该都是些很不成熟甚至是不太正确的想法.但是我还是想记录下来,算是一个心路历程吧.等以后成熟了,再来修改. 首先说一 ...

  7. Linux网络子系统

    再Linux的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Linux系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.下面我们揭示Linux网络子系统的秘密 sockfs ...

  8. 关于EJB,为什么用EJB?为什么不用EJB?

    http://blog.csdn.net/linxi1209163com/article/details/51029890 一:什么是EJB 官方说法,就是企业级是基于语言的服务器框架技术,通过我们可 ...

  9. ABP实战--项目结构

    学习完毕With ASP.NET Core & Entity Framework Core Part-1及Part-2后,只实现了基本的功能,使用该工程继续学习ABP的更多功能. 更改项目结构 ...

  10. SSH和SSL比较

    一.SSH介绍 什么是SSH? 传统的网络服务程序,如:ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据, 别有用心的人非常容易就可以截 获这些口令和数据.而且, ...