服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#使用Npoi导出Excel并合并行列

C#使用Npoi导出Excel并合并行列

2023-02-09 15:29曹悠然 C#

这篇文章主要为大家详细介绍了C#使用Npoi导出Excel并合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在工作开发中,客户经常要求数据库中数据导出到Excel表格。以前方法是引用office相关组件,如果客户没有安装office,功能就会遇到问题。

现在用Npoi导出Excel,导出表格是合并行列,如图:

C#使用Npoi导出Excel并合并行列

导出的要求:合计列要进行合并,序号一致的要合并。最后一行要合并列。
因为相同序号数量不是固定的,要动态算合并的行数。

合并行列接口:XXX.AddMergedRegion(new CellRangeAddress(开始行, 最后一行, 开始列, 最后一列));

隐藏指定:sheet.SetColumnHidden(cellIndex, true);

引用组件:

NPOI.dll;
NPOI.OOXML.dll;
NPOI.OpenXml4Net.dll;
NPOI.OpenXmlFormats.dll;
ICSharpCode.SharpZipLib.dll;

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/// <summary>
/// 
/// </summary>
/// <param name="dtSource">数据源</param>
/// <param name="strFileName">保存路径</param>
/// <param name="dvXH">序号</param>
public void Export(DataTable dtSource,string strFileName,DataView dvXH=null)
        {
            //创建工作簿 office2007以上
            XSSFWorkbook workbook = new XSSFWorkbook();
            //为工作簿创建工作表并命名
            ISheet sheet = workbook.CreateSheet("商品表");
 
            ICellStyle dateStyle = workbook.CreateCellStyle();
 
            IDataFormat format = workbook.CreateDataFormat();
            dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
 
            #region 表头及样式
            int cellIndex = 0;
            IRow headerRow = sheet.CreateRow(0);
            for (int i = 0; i < dtSource.Columns.Count; i++)
            {
                #region MyRegion
                string ColumnsName = dtSource.Columns[i].ToString();
                if (dtSource.Columns[i].ColumnName.EndsWith("XH"))
                {
                    ColumnsName = "序号";
                    sheet.SetColumnWidth(cellIndex, 3000);
                   //sheet.SetColumnHidden(cellIndex, true);隐藏指定列
                }
                else if (dtSource.Columns[i].ColumnName.EndsWith("GoogName"))
                {
                    ColumnsName = "商品名称";
                    sheet.SetColumnWidth(cellIndex,10000);//设置列宽
                }
                else if (dtSource.Columns[i].ColumnName.EndsWith("Num"))
                {
                    ColumnsName = "数量";
                    sheet.SetColumnWidth(cellIndex, 5000);
                }
 
                else if (dtSource.Columns[i].ColumnName.EndsWith("Summation"))
                {
                    ColumnsName = "合计(元)";
                    sheet.SetColumnWidth(cellIndex, 5000);
                }
                #endregion
 
                //设置行高
                headerRow.HeightInPoints = 35; 
                headerRow.CreateCell(cellIndex).SetCellValue(ColumnsName);
 
                ICellStyle headStyle = workbook.CreateCellStyle();
                headStyle.WrapText = true;
                IFont font = workbook.CreateFont();
                //字体大小
                font.FontHeightInPoints = 12;
                font.Boldweight = 360;
                headStyle.SetFont(font);
                headerRow.GetCell(cellIndex).CellStyle = headStyle;
                cellIndex++;
            }
            #endregion
 
            int rowIndex = 1;//行数一定要从1行开始
            int count = 1;
            int startRow = 1;
            DataView dvSource = dtSource.DefaultView;
            if (dvXH!=null)
            {
                foreach (DataRowView drv in dvXH)
                {//1-10.11-12,13-14,15-16
                    int rowcout = 0;
                    dvSource.RowFilter = "XH='" + drv["XH"] + "'";
                    foreach (DataRowView row in dvSource)
                    {
                        #region 填充内容
                        IRow dataRow = sheet.CreateRow(rowIndex);
 
                        //序号
                        ICell newCel0 = dataRow.CreateCell(0);
                        ICellStyle style0 = workbook.CreateCellStyle();
                        style0.DataFormat = format.GetFormat("text");
                        newCel0.SetCellValue(row["XH"].ToString());
 
                        //标的名称
                        ICell newCel2 = dataRow.CreateCell(1);
                        ICellStyle style2 = workbook.CreateCellStyle();
                        style2.DataFormat = format.GetFormat("text");
                        newCel2.SetCellValue(row["GoogName"].ToString());
 
                        //标的数量
                        ICell newCel4 = dataRow.CreateCell(2);
                        ICellStyle style4 = workbook.CreateCellStyle();
                        style4.DataFormat = format.GetFormat("text");
                        newCel4.SetCellValue(row["Num"].ToString());
 
                        //合计(元)
                        ICell newCel8 = dataRow.CreateCell(3);
                        ICellStyle style8 = workbook.CreateCellStyle();
                        style8.DataFormat = format.GetFormat("text");
                        newCel8.SetCellValue(row["Summation"].ToString());
                        #endregion
 
                        rowIndex++;
                        rowcout++;
                    }
 
                    if (count == 1)
                    {
                        //合并行数
                        sheet.AddMergedRegion(new CellRangeAddress(startRow, rowcout, 3, 3));
                        startRow = startRow + rowcout;
                    }
                    else
                    {
                        sheet.AddMergedRegion(new CellRangeAddress(startRow, startRow + rowcout - 1, 3, 3));
                        startRow = startRow + rowcout;
                    }
                    count++;
                }
            }
            else
            {
                #region MyRegion
                foreach (DataRowView row in dvSource)
                {
                    #region 填充内容
                    IRow dataRow = sheet.CreateRow(rowIndex);
 
                    //序号
                    ICell newCel0 = dataRow.CreateCell(0);
                    ICellStyle style0 = workbook.CreateCellStyle();
                    style0.DataFormat = format.GetFormat("text");
                    newCel0.SetCellValue(row["XH"].ToString());
              
                    //商品名称
                    ICell newCel1 = dataRow.CreateCell(1);
                    ICellStyle style1 = workbook.CreateCellStyle();
                    style1.DataFormat = format.GetFormat("text");
                    newCel1.SetCellValue(row["GoogName"].ToString());
 
                    //数量
                    ICell newCel2 = dataRow.CreateCell(2);
                    ICellStyle style2 = workbook.CreateCellStyle();
                    style2.DataFormat = format.GetFormat("text");
                    newCel2.SetCellValue(row["Num"].ToString());
                   
                    //合计(元)
                    ICell newCel3 = dataRow.CreateCell(3);
                    ICellStyle style3 = workbook.CreateCellStyle();
                    style3.DataFormat = format.GetFormat("text");
                    newCel3.SetCellValue(row["Summation"].ToString());
                    #endregion
                    rowIndex++;
                }
                #endregion
            }
            #region 拼接最后一行
            IFont fontLast = workbook.CreateFont();
            fontLast.FontHeightInPoints = 30;
            fontLast.Boldweight = 480;
            IRow dataRowLast = sheet.CreateRow(rowIndex);
            dataRowLast.HeightInPoints = 40;
            ICell newCelLast = dataRowLast.CreateCell(0);
            ICellStyle styleLast = workbook.CreateCellStyle();
            styleLast.DataFormat = format.GetFormat("text");
            styleLast.SetFont(fontLast);
            newCelLast.SetCellValue("制作人:张三");
            sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 3));
            #endregion
 
            MemoryStream stream = new MemoryStream();
            workbook.Write(stream);
            var buf = stream.ToArray();
            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }
}

实际运用中,涉及到数据,方法中有很多校验等操作,方法直观可读性不是太好,下面附上简单导出的方法:

实际上导出Excel,总结有几点:

1、引用相关组件
2、创建一个工作簿,创建工作表并命名;
3、设置表头及样式;
4、填充数据;
5、保存数据到指定位置;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/// <summary>
/// 简单导出数据
/// </summary>
/// <param name="dtSource">数据源</param>
/// <param name="strFileName">保存路径</param>
/// <param name="dvXH">序号</param>
        public void Export1(DataTable dtSource, string strFileName)
        {
            //创建工作簿
            XSSFWorkbook workbook = new XSSFWorkbook();
            //为工作簿创建工作表并命名
            ISheet sheet = workbook.CreateSheet("商品表");
            IDataFormat format = workbook.CreateDataFormat();
 
            #region 表头及样式
            int cellIndex = 0;
            IRow headerRow = sheet.CreateRow(0);
            for (int i = 0; i < dtSource.Columns.Count; i++)
            {
                //设置行高
                headerRow.HeightInPoints = 35;
                headerRow.CreateCell(cellIndex).SetCellValue(dtSource.Columns[i].ToString());
                ICellStyle headStyle = workbook.CreateCellStyle();
                headStyle.WrapText = true;
                IFont font = workbook.CreateFont();
                //字体大小
                font.FontHeightInPoints = 12;
                font.Boldweight = 360;
                headStyle.SetFont(font);
                headerRow.GetCell(cellIndex).CellStyle = headStyle;
                cellIndex++;
            }
            #endregion
 
            #region 数据填充
            int rowIndex = 1;//行数一定要从1行开始,因为上面已经创建了表头为0行;
            DataView dvSource = dtSource.DefaultView;
 
            foreach (DataRow row in dtSource.Rows)
            {
                int ColumnIndex = 0;
                IRow dataRow = sheet.CreateRow(rowIndex);
                foreach (DataColumn column in dtSource.Columns)
                {
                    //序号
                    ICell newCel0 = dataRow.CreateCell(ColumnIndex);
                    ICellStyle style0 = workbook.CreateCellStyle();
                    style0.DataFormat = format.GetFormat("text");//数据类型
                    newCel0.SetCellValue(row[column.ColumnName].ToString());
                    ColumnIndex++;
                }
                rowIndex++;
            }
            #endregion
 
            #region 保存到指定位置
            MemoryStream stream = new MemoryStream();
            workbook.Write(stream);
            var buf = stream.ToArray();
            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }
            #endregion
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_40233187/article/details/109142966

延伸 · 阅读

精彩推荐
  • C#C#判断一个String是否为数字类型

    C#判断一个String是否为数字类型

    本文主要介绍C#判断一个String是否为数字类型几种的方法,需要的朋友可以参考下。...

    cg_program4382021-11-24
  • C#C# 使用Word模板导出数据的实现代码

    C# 使用Word模板导出数据的实现代码

    最近接到个需求,使用word模板导出数据,怎么实现这个需求呢,今天小编通过实例代码给大家介绍C# 使用Word模板导出数据的方法,感兴趣的朋友一起看看...

    沙漠狼11712022-11-22
  • C#基于C#实现简单离线注册码生成与验证

    基于C#实现简单离线注册码生成与验证

    本文使用RSA非对称加密和Base64简单地实现离线注册码的生成与验证功能。感兴趣的朋友跟着小编一起学习吧...

    C#教程网4132021-10-28
  • C#C#编程高并发的几种处理方法详解

    C#编程高并发的几种处理方法详解

    这篇文章主要为大家详细介绍了C#编程高并发的几种处理方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zock5012022-02-17
  • C#编辑IL文件 修改DLL文件的方法

    编辑IL文件 修改DLL文件的方法

    下面小编就为大家带来一篇编辑IL文件 修改DLL文件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网10662021-12-27
  • C#unity 如何获取Text组件里text内容的长度

    unity 如何获取Text组件里text内容的长度

    这篇文章主要介绍了unity 获取Text组件里text内容的长度操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    贪玩的孩纸时代6252022-11-13
  • C#解析C#设计模式编程中的装饰者模式

    解析C#设计模式编程中的装饰者模式

    这篇文章主要介绍了C#设计模式编程中的装饰者模式,同时也谈到了其在.NET框架中的应用,需要的朋友可以参考下...

    张龙豪3802021-11-12
  • C#用c# 自动更新程序

    用c# 自动更新程序

    这篇文章主要介绍了用c# 自动更新程序的代码示例,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...

    冰封一夏5072022-10-17