C#WinFrom导出Excel
阅读原文时间:2023年07月10日阅读:2

采用的是以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
{
///

/// ExportToExcel ///
/// 数据表
/// 工作簿名字
/// 文件路径
/// 列头
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的时候可以加入一个判断标记为 传参的时候加入,根据标记为来改变赋值情况。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器