C#使用NPOI.dll向已有的Excle模版插入数据

原文:http://www.vuvps.com/?p=170

在写C#脚本的时候,有一个这样的需求:

根据一张Excle表中的邮箱字段,来生成多张表,大概样子就是下图这样(图丑了点C#使用NPOI.dll向已有的Excle模版插入数据

C#使用NPOI.dll向已有的Excle模版插入数据

NPOI版本使用的2.3版本

使用方式:

1
2
DataTable dt = new DataTable(); //准备好要插入的数据源。
ExportExcelByTemple(dt,strFileName,templetPath,20,3);

下面就是C#NPOI向已有的Excle模版插入数据的封装方法,调用很简单。

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
/// <summary>
        /// 用模板导出Excel
        /// </summary>
        /// <param name="table"></param>
        /// <param name="strFileName">导出路径</param>
        /// <param name="templetPath">模板路径</param>
        /// <param name="startRow">从第几行开始写数据,从1开始</param>
        public static void ExportExcelByTemple(System.Data.DataTable dtSource,
              string strFileName,string templetPath, int rowHeight, int startRow)
        {
            try
            {
                HSSFWorkbook workbook = getWorkBook(templetPath);
                HSSFSheet sheet = getSheet(workbook);
                writeData(workbook, sheet, dtSource, strFileName, rowHeight, startRow);
                saveData(workbook, strFileName);
            }
            catch (Exception ex)
            {
                //LogInfo.Log(ex);
                throw ex;
            }
        }
   
        /// <summary>
        /// 解析Excel模板,返回WorkBook
        /// </summary>
        /// <param name="templetPath"></param>
        /// <returns></returns>
        private static HSSFWorkbook getWorkBook(string templetPath)
        {
            FileStream file = new FileStream(templetPath, 
            FileMode.Open, FileAccess.Read);
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            return workbook;
        }
  
        /// <summary>
        /// 返回Sheet
        /// </summary>
        /// <param name="workbook"></param>
        /// <returns></returns>
        private static HSSFSheet getSheet(HSSFWorkbook workbook)
        {
            return workbook.GetSheetAt(0);
        }
  
        /// <summary>
        /// 
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="sheet"></param>
        /// <param name="dtSource"></param>
        /// <param name="strFileName"></param>
        /// <param name="rowHeight"></param>
        /// <param name="startRow"></param>
        /// <param name="size"></param>
        private static void writeData(HSSFWorkbook workbook, HSSFSheet sheet, 
                            System.Data.DataTable dtSource,string strFileName,
                            int rowHeight, int startRow)
        {
            // //填充表头     
            HSSFRow dataRow = new HSSFRow();
            //填充内容     
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                dataRow = sheet.CreateRow(i + startRow - 1);
                dataRow.Height = (short)(rowHeight * 20);
                for (int j = 0; j < dtSource.Columns.Count; j++)
                {               
                        string drValue = dtSource.Rows[i][j].ToString();
                            dataRow.CreateCell(j).SetCellValue(drValue);
                }
            }
        }
   
        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="strFileName"></param>
        private static void saveData(HSSFWorkbook workbook, string strFileName)
        {
            //保存     
            using (MemoryStream ms = new MemoryStream())
            {
                using (FileStream fs = new FileStream(strFileName, 
                                FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
            }
        }