采用的是以DataGridView的形式导出,使用NPOI.dll
1.由于使用的是DataGridView,所以类需要创建在From的Project下,DLL导入NPOI
2.代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NPOI.SS.UserModel; //NPOI
using NPOI.HSSF.Util; //NPOI
using NPOI.HSSF.UserModel; //NPOI
using NPOI.XSSF.UserModel; //NPOI
using System.IO;
namespace ESMT
{
public class ExportExcel
{
///
/// 数据表
/// 工作簿名字
/// 文件路径
/// 列头
public void ExportToExcel(DataGridView grdview, string sheetName, string FilePath, string[] columnTitle)
{
//不允许dataGridView显示添加行,负责导出时会报最后一行未实例化错误
grdview.AllowUserToAddRows = false;
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(sheetName);//创建工作簿
//设置表头
IRow headerRow = sheet.CreateRow();//创建第一行
headerRow.HeightInPoints = ;
headerRow.CreateCell().SetCellValue("出库表单");//单元格赋值
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//格式居中
IFont font = workbook.CreateFont();
font.Boldweight = ;
font.FontHeightInPoints = ;
headStyle.SetFont(font);
headerRow.GetCell().CellStyle = headStyle;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(, , , grdview.ColumnCount - ));//单元格合并 最后个参数是合并个数
IRow headerRow2 = sheet.CreateRow();//创建第二行列头
ICellStyle headStyle2 = workbook.CreateCellStyle();
headStyle2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
IFont font2 = workbook.CreateFont();
font2.FontHeightInPoints = ;
font2.Boldweight = ;
headStyle2.SetFont(font2);
for (int l = ; l < grdview.ColumnCount - ; l++) //列头填值
{
headerRow2.CreateCell(l).SetCellValue(columnTitle\[l\]);
headerRow2.GetCell(l).CellStyle = headStyle2;
}
//设置列宽
for (int l = ; l < grdview.Columns.Count; l++)
{
sheet.DefaultColumnWidth = ;
}
//填写内容
for (int i = ; i < grdview.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + );
for (int j = ; j < grdview.Columns.Count; j++)
{
row.CreateCell(j - , CellType.String).SetCellValue(grdview.Rows\[i\].Cells\[j\].Value.ToString());//j-1表示哪个单元格
}
}
using (FileStream stream = File.OpenWrite(FilePath))//创建Excel并写入数据
{
workbook.Write(stream);
stream.Close();
}
GC.Collect();
}
}
}
ExportExcel
PS:openwtrie 打开或者创建新的文件写入
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NPOI.SS.UserModel; //NPOI
using NPOI.HSSF.Util; //NPOI
using NPOI.HSSF.UserModel; //NPOI
using NPOI.XSSF.UserModel; //NPOI
using System.IO;
namespace ESMT
{
public class ExportExcel
{
///
/// 数据表
/// 工作簿名字
/// 文件路径
/// 列头
public bool ExportToExcel(DataGridView grdview, string sheetName, string FilePath, string[] columnTitle, bool ischeckbox)
{
try
{
//不允许dataGridView显示添加行,负责导出时会报最后一行未实例化错误
grdview.AllowUserToAddRows = false;
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(sheetName);//创建工作簿
//设置表头
IRow headerRow = sheet.CreateRow();//创建第一行
headerRow.HeightInPoints = ;
headerRow.CreateCell().SetCellValue("出库表单");//单元格赋值
ICellStyle headStyle = workbook.CreateCellStyle();//
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//格式居中
headStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//格式居中
IFont font = workbook.CreateFont();
font.Boldweight = ;
font.FontHeightInPoints = ;
headStyle.SetFont(font);//设置了第一行样式的字体
headerRow.GetCell().CellStyle = headStyle;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(, , , grdview.ColumnCount - ));//单元格合并 最后个参数是合并个数
IRow headerRow2 = sheet.CreateRow();//创建第二行列头
ICellStyle headStyle2 = workbook.CreateCellStyle();//设置第二行的样式
headStyle2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
IFont font2 = workbook.CreateFont();
font2.FontHeightInPoints = ;
font2.Boldweight = ;
headStyle2.SetFont(font2);
ICellStyle headStyle3 = workbook.CreateCellStyle();//内容的样式
headStyle3.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//格式居中
headStyle3.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//格式居中
for (int l = ; l < grdview.ColumnCount - ; l++) //列头填值
{
headerRow2.CreateCell(l).SetCellValue(columnTitle\[l\]);
headerRow2.GetCell(l).CellStyle = headStyle2;
}
//设置默认列宽
//sheet.DefaultColumnWidth = 15;
//设置列宽
AutoColumnWidth(sheet, grdview.ColumnCount);
//填写内容
for (int i = ; i < grdview.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + );
for (int j = ; j < grdview.Columns.Count; j++)
{
if (ischeckbox)
{//带checkbox的DataGrid
row.CreateCell(j - , CellType.String).SetCellValue(grdview.Rows\[i\].Cells\[j\].Value.ToString());
row.GetCell(j - ).CellStyle = headStyle3;
}//j-1表示哪个单元格
else
{
row.CreateCell(j - , CellType.String).SetCellValue(grdview.Rows\[i\].Cells\[j - \].Value.ToString());//j-1表示哪个单元格
row.GetCell(j - ).CellStyle = headStyle3;
}
}
}
using (FileStream stream = File.OpenWrite(FilePath))//创建Excel并写入数据
{
workbook.Write(stream);
stream.Close();
}
GC.Collect();
return true;//导出成功
}
catch (Exception)
{
return false;//导出失败
}
}
/// <summary>
/// 自适应列宽
/// </summary>
/// <param name="sheet"></param>
/// <param name="cols"></param>
public void AutoColumnWidth(ISheet sheet, int cols)
{
for (int col = ; col < cols - ; col++)//个数和列头个数统一
{
sheet.AutoSizeColumn(col);//自适应宽度,但是其实还是比实际文本要宽
int columnWidth = sheet.GetColumnWidth(col) / ;//获取当前列宽度
for (int rowIndex = ; rowIndex <= sheet.LastRowNum; rowIndex++)
{
IRow row = sheet.GetRow(rowIndex);
ICell cell = row.GetCell(col);
int contextLength = Encoding.UTF8.GetBytes(cell.ToString()).Length;//获取当前单元格的内容宽度
columnWidth = columnWidth < contextLength ? contextLength : columnWidth;
}
sheet.SetColumnWidth(col, columnWidth \* );//设置列宽
}
}
}
}
改善版1.0
3.From窗口点击导出按钮
string[] columnTitle = { "序号", "仓位", "Facility", "供应商料号", "料号", "料卷ID", "料卷数量", "储位号", "Date Code/Lot", "生产日期", "供应商编码", "入仓时间" };
string localFilePath = "";// fileNameExt, newFileName, FilePath;
SaveFileDialog sfd = new SaveFileDialog();//保存文件窗口
//设置文件类型
sfd.Filter = "Excel(97-2003)|*.xls";//保存类型为EXCEL
//保存对话框是否记忆上次打开的目录
sfd.RestoreDirectory = true;
//点了保存按钮进入
if (sfd.ShowDialog() == DialogResult.OK)
{
localFilePath = sfd.FileName.ToString(); //获得文件路径
ex.ExportToExcel(grdData, "出库表单", localFilePath, columnTitle);
}
导出按钮
通过以上三步,完成点击导出按钮,后选择保存位置并命名,调用EportExcel方法完成导出Excel。
PS:使用DataTable的操作是一样,只是赋值的时候取DataTable的值。GC 是自动垃圾收集 如果没有Checkbox的时候可以加入一个判断标记为 传参的时候加入,根据标记为来改变赋值情况。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章