C#WinFrom导出Excel

采用的是以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
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="grdview">数据表</param>
        /// <param name="sheetName">工作簿名字</param>
        /// <param name="FilePath">文件路径</param>
        /// <param name="columnTitle">列头</param>
        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(0);//创建第一行
            headerRow.HeightInPoints = 40;
            headerRow.CreateCell(0).SetCellValue("出库表单");//单元格赋值
            ICellStyle headStyle = workbook.CreateCellStyle();
            headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//格式居中
            IFont font = workbook.CreateFont();
            font.Boldweight = 500;
            font.FontHeightInPoints = 20;
            headStyle.SetFont(font);
            headerRow.GetCell(0).CellStyle = headStyle;
            sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, grdview.ColumnCount - 2));//单元格合并 最后个参数是合并个数

            IRow headerRow2 = sheet.CreateRow(1);//创建第二行列头
            ICellStyle headStyle2 = workbook.CreateCellStyle();
            headStyle2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
            IFont font2 = workbook.CreateFont();
            font2.FontHeightInPoints = 10;
            font2.Boldweight = 700;
            headStyle2.SetFont(font2);
            for (int l = 0; l < grdview.ColumnCount - 1; l++) //列头填值
            {
                headerRow2.CreateCell(l).SetCellValue(columnTitle[l]);
                headerRow2.GetCell(l).CellStyle = headStyle2;
            }

            //设置列宽
            for (int l = 0; l < grdview.Columns.Count; l++)
            {
                sheet.DefaultColumnWidth = 15;
            }

            //填写内容
            for (int i = 0; i < grdview.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i + 2);
                for (int j = 1; j < grdview.Columns.Count; j++)
                {
                    row.CreateCell(j - 1, 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
    {
        /// <summary>
        /// ExportToExcel
        /// </summary>
        /// <param name="grdview">数据表</param>
        /// <param name="sheetName">工作簿名字</param>
        /// <param name="FilePath">文件路径</param>
        /// <param name="columnTitle">列头</param>
        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(0);//创建第一行
                headerRow.HeightInPoints = 40;
                headerRow.CreateCell(0).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 = 500;
                font.FontHeightInPoints = 20;
                headStyle.SetFont(font);//设置了第一行样式的字体

                headerRow.GetCell(0).CellStyle = headStyle;
                sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, grdview.ColumnCount - 2));//单元格合并 最后个参数是合并个数

                IRow headerRow2 = sheet.CreateRow(1);//创建第二行列头
                ICellStyle headStyle2 = workbook.CreateCellStyle();//设置第二行的样式
                headStyle2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                IFont font2 = workbook.CreateFont();
                font2.FontHeightInPoints = 10;
                font2.Boldweight = 700;
                headStyle2.SetFont(font2);

                ICellStyle headStyle3 = workbook.CreateCellStyle();//内容的样式
                headStyle3.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//格式居中
                headStyle3.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//格式居中

                for (int l = 0; l < grdview.ColumnCount - 1; l++) //列头填值 
                {
                    headerRow2.CreateCell(l).SetCellValue(columnTitle[l]);
                    headerRow2.GetCell(l).CellStyle = headStyle2;
                }
                //设置默认列宽
                //sheet.DefaultColumnWidth = 15;

                //设置列宽
                AutoColumnWidth(sheet, grdview.ColumnCount);

                //填写内容
                for (int i = 0; i < grdview.Rows.Count; i++)
                {
                    IRow row = sheet.CreateRow(i + 2);
                    for (int j = 1; j < grdview.Columns.Count; j++)
                    {
                        if (ischeckbox)
                        {//带checkbox的DataGrid
                            row.CreateCell(j - 1, CellType.String).SetCellValue(grdview.Rows[i].Cells[j].Value.ToString());
                            row.GetCell(j - 1).CellStyle = headStyle3;
                        }//j-1表示哪个单元格                   
                        else
                        {
                            row.CreateCell(j - 1, CellType.String).SetCellValue(grdview.Rows[i].Cells[j - 1].Value.ToString());//j-1表示哪个单元格
                            row.GetCell(j - 1).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 = 0; col < cols - 1; col++)//个数和列头个数统一
            {
                sheet.AutoSizeColumn(col);//自适应宽度,但是其实还是比实际文本要宽
                int columnWidth = sheet.GetColumnWidth(col) / 256;//获取当前列宽度
                for (int rowIndex = 1; 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 * 400);//设置列宽

            }
        }
    }

}
改善版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的时候可以加入一个判断标记为 传参的时候加入,根据标记为来改变赋值情况。 

原文地址:https://www.cnblogs.com/cdjbolg/p/11771546.html