.net NPOI导出Excel,自定义单元格背景颜色,office2007及以上,及office2003使用方法

目录NPOI相关功能目录

开发环境:VS2015

.Net版本:.NetFramework4.5.2

NPOI版本:2.4.1.0

本以为NPOI使用颜色值会非常方便,以为RGB或16进制赋值就行了没想到NPOI不这样给我们用,无语了,只能自已想办法实现了

office 2007及以上本身就有自已方法实现

office 2003话需要用调色版方法去实现

参考了很多网友整理,此功能为了实现NPOI导出Excel,自定义单元格背景颜色,office2007及以上,及office2003使用方法以下为代码:

参考原文地址https://blog.csdn.net/weixin_34253539/article/details/85936093

https://www.cnblogs.com/yxhblog/p/6225018.html

百度网盘下载源码实现NPOI导出Excel,自定义单元格背景颜色,office2007及以上,及office2003使用方法 提取码:spuz

代码几个点介绍:

1
2
3
4
public static ICellStyle GetXSSFWorkbookStyle(IWorkbook workbook) //Office 2007及以上列头样式 这里有使用自定义背景颜色
public static ICellStyle GetHSSFWorkbook(IWorkbook workbook)  //office 2003列头样式 这里有使用自定义背景颜色
public static HSSFPalette NpoiCustomizeColor(IWorkbook workBook)  //调色板 主要是为office 2003准备的自定义颜色
public static byte[] MyColor(int color)  //自定义颜色 office 2007可直接用

以下为主要代码:

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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace NOPIPractice
{
    public partial class Form1 : Form
    {
        DataTable dt;
        SaveFileDialog saveFileDialog;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            /*为了测试造一点数据*/
            dt = new DataTable();
            DataColumn dc1 = new DataColumn();  //生成第一个列对象
            dc1.ColumnName = "col1";
            dc1.Caption = "序号";
            DataColumn dc2 = new DataColumn();  //生成第二个列对象
            dc2.ColumnName = "col2";
            dc2.Caption = "列1";
            DataColumn dc3 = new DataColumn();  //生成第三个列对象
            dc3.ColumnName = "col3";
            dc3.Caption = "列2";
 
            //分别把列加入到DataTable中
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);
            dt.Columns.Add(dc3);
 
            Random rand = new Random();
            //动态给列赋值
            for (int i = 0; i < 22; i++)
            {
                DataRow dr = dt.NewRow();  //生名一行数据,这一行数据就会有上面生成的列
 
                dr["col1"] = (i+1);      //给每一列赋值
                dr["col2"] = i + "b" + rand.Next(1000, 9999);
                dr["col3"] = i + "c" + rand.Next(1000, 9999);
                dt.Rows.Add(dr);           //将行加入到表格中
            }
        }
 
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            if (saveFileDialog != null) saveFileDialog = null;
 
            saveFileDialog = new SaveFileDialog();
            saveFileDialog.Title = "导出Excel";
            saveFileDialog.Filter = "Excel文件(*.xls)|*.xls|Excel文件(*.xlsx)|*.xlsx";
            saveFileDialog.FileName = DateTime.Now.ToString("yyyyMMddHHmmss");  //默认文件名
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (saveFileDialog.FileName != "")
                {
                    DataTableToExcel(saveFileDialog.FileName, dt, false"test");
                }
            }
        }
         
        ////// DataTable数据导入到Excel
        //////导出文件路径///需要导出的DataTable数据///是否追加,追加的会在Excel上追加数据,否则覆盖数据///Excel下面sheet1这个名字///public bool DataTableToExcel(string fileName, DataTable dt, bool isAppend, string sheetName)
        {
            int count = 0;
            ISheet sheet = null;
            IWorkbook workbook = null;
 
            try
            {
                using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    if (!isAppend)
                    {
                        if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.LastIndexOf(".")) == ".xlsx"// 2007版本
                            workbook = new XSSFWorkbook();
                        else if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.LastIndexOf(".")) == ".xls"// 2003版本
                            workbook = new HSSFWorkbook();
                    }
                    else
                    {
                        if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.LastIndexOf(".")) == ".xlsx"// 2007版本
                            workbook = new XSSFWorkbook(fs);
                        else if (saveFileDialog.FileName.Substring(saveFileDialog.FileName.LastIndexOf(".")) == ".xls"// 2003版本
                            workbook = new HSSFWorkbook(fs);
                    }
                    try
                    {
                        if (!isAppend)
                        {
                            sheet = workbook.CreateSheet(sheetName); //声明sheet对象下面操作需要用
                        }
                        else
                        {
                            sheet = workbook.GetSheetAt(0);  //追加时获取sheet对象
                        }
 
                        if (!isAppend)
                        {
                            //列头及样式                      
                            IRow headerRow = sheet.CreateRow(0);
                            headerRow.Height = (int)(10 * 20 * 2.44);
 
                            ICellStyle headerStyle = GetHeadStyle(workbook);  //获取列头样式
                           
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                headerRow.CreateCell(i).SetCellValue(dt.Columns[i].Caption);
                                headerRow.GetCell(i).CellStyle = headerStyle;
                                //设置列宽  
                                sheet.SetColumnWidth(i, ((int)((100) * 20 * 2.44))); //这里规则不太清楚就知道我们要设置列宽为10px或者其它,我们就10*20*2.44这样就可以了            
                            }
                        }
 
                        count = sheet.LastRowNum + 1;
 
                        for (int i = 0; i < dt.Rows.Count; ++i)
                        {
                            IRow row = sheet.CreateRow(count);
                            row.Height = (int)(7 * 20 * 2.44);
 
                            for (int j = 0; j < dt.Columns.Count; ++j)
                            {
 
                                ICell cell = row.CreateCell(j);
                                cell.SetCellValue(dt.Rows[i][dt.Columns[j].ColumnName].ToString());
                            }
                            ++count;
                        }
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                }
                FileStream outFs = new FileStream(fileName, FileMode.Open);
                workbook.Write(outFs);
                outFs.Close();
                outFs.Dispose();
            }
            catch(Exception ex)
            {
                return false;
            }
            return true;
        }
 
        ////// Excel列头样式
        /////////public static ICellStyle GetHeadStyle(IWorkbook workbook)
        {
            /*我们要实现单元格自定义颜色office 2007以上及office2003是不一样
             * 本以为NPOI使用颜色值会非常方便,以为RGB或16进制赋值就行了,
             * 没想到NPOI不这样给我们用,无语了,只能自已想办法实现了
             * office 2007及以上本身就有自已方法实现
             * office 2003话需要用调色版方法去实现
             */
            if (workbook is XSSFWorkbook)  //office 2007及以上
            {
                return GetXSSFWorkbookStyle(workbook);
            }
            else 
            {
                return GetHSSFWorkbook(workbook);
            }
        }
 
        ////// Office 2007及以上列头样式
        /////////public static ICellStyle GetXSSFWorkbookStyle(IWorkbook workbook)
        {
            XSSFCellStyle headStyle = ((XSSFCellStyle)workbook.CreateCellStyle());
            headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
            headStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
             
            headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
       
            headStyle.FillForegroundColor = 0;
            headStyle.FillPattern = FillPattern.SolidForeground;
            //这里可以使用自定义颜色值
            ((XSSFColor)headStyle.FillForegroundColorColor).SetRgb(MyColor(9));       
 
            XSSFColor xssfColor = new XSSFColor();
            xssfColor.SetRgb(MyColor(4));
 
            XSSFFont font = (XSSFFont)workbook.CreateFont();
            font.FontName = "Aria"//和excel里面的字体对应
 
            font.FontHeightInPoints = 11;
            font.Boldweight = 700;
            font.SetColor(xssfColor);
            headStyle.SetFont(font);
 
            return headStyle;
        }
 
        ////// office 2003列头样式
        //////public static ICellStyle GetHSSFWorkbook(IWorkbook workbook)
        {
            byte[] myColor = MyColor(8);
            HSSFPalette palette = NpoiCustomizeColor(workbook);
            HSSFColor hssFColor = palette.FindColor(myColor[0], myColor[1], myColor[2]);
 
            ICellStyle headStyle = workbook.CreateCellStyle();
            headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
            headStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
 
            headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
        
            headStyle.FillForegroundColor = hssFColor.Indexed;
            headStyle.FillPattern = FillPattern.SolidForeground;         
 
            myColor = MyColor(4);
            hssFColor = palette.FindColor(myColor[0], myColor[1], myColor[2]);
            IFont font = workbook.CreateFont();
            font.FontName = "Aria"//和excel里面的字体对应
 
            font.FontHeightInPoints = 11;
            font.Boldweight = 700;
            font.Color = hssFColor.Indexed;
            headStyle.SetFont(font);
 
            return headStyle;
        }
 
        ////// 调色板 主要是为office 2003准备的自定义颜色
        /// 这里可以在把颜色值放到调色版上
        /////////public static HSSFPalette NpoiCustomizeColor(IWorkbook workBook)
        {
            byte[] myColor = MyColor(1);
            HSSFPalette palette = ((HSSFWorkbook)workBook).GetCustomPalette();
            palette.SetColorAtIndex(8, myColor[0], myColor[1], myColor[2]);  //第一个参数 8-64 后面3个rgb颜色值
            myColor = MyColor(2);
            palette.SetColorAtIndex(9, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(3);
            palette.SetColorAtIndex(10, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(4);
            palette.SetColorAtIndex(11, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(5);
            palette.SetColorAtIndex(12, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(6);
            palette.SetColorAtIndex(13, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(7);
            palette.SetColorAtIndex(14, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(8);
            palette.SetColorAtIndex(15, myColor[0], myColor[1], myColor[2]);
            myColor = MyColor(9);
            palette.SetColorAtIndex(16, myColor[0], myColor[1], myColor[2]);
            return palette;
        }
 
        ////// 我的自定义颜色
        /// 这里可以添加自已需要RGB颜色值
        /////////public static byte[] MyColor(int color)
        {
            switch (color)
            {
                //标题
                case 1: return new byte[] { 226, 233, 245 };
                case 2: return new byte[] { 69, 157, 191 };
                //列头
                case 3: return new byte[] { 243, 243, 243 };
                case 4: return new byte[] { 101, 101, 101 };
                //列
                case 5: return new byte[] { 255, 255, 255 };
                case 6: return new byte[] { 101, 101, 101 };
                case 7: return new byte[] { 167, 167, 167 };
                //
                case 8: return new byte[] { 230, 132, 151 };
                case 9: return new byte[] { 41, 57, 85 };
                defaultreturn new byte[] { 226, 233, 245 };
            }
        }
    }
}
转发:http://kai8wu.com/Content/artsta/139.html
posted @ 2023-01-22 21:56  人生就是修炼  阅读(225)  评论(0编辑  收藏  举报