NPOI生成Excel

    偶尔一次午饭时人事说加班加到8点多,纯手工复制粘贴Excel的内容,公司大概150多人吧,每次发工资时都需要这样手动处理,将一个Excel拆分成150多个Excel,再把里面的内容粘过去,如此循环。于是,我写了个小程序帮人事MM解决。

 

解决方法

     主要是用到了NPOI生成Excel,根据每条记录创建一个Excel,并读取员工姓名作为文件名,并设置Excel为只读。

 

界面预览

     

      导入和拆分在状态栏都会有相应提示

 

代码

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
/// <summary>
        /// 读取excel
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public  DataSet ToDataTable( string  filePath, string  fileName)
        {
            string  connStr =  "" ;
 
            string  fileType = System.IO.Path.GetExtension(fileName);
 
            if  ( string .IsNullOrEmpty(fileType))  return  null ;
 
            if  (fileType ==  ".xls" )
            {
                connStr =  "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  + filePath +  ";"  ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"" ;
            }
            else
            {
                connStr =  "Provider=Microsoft.ACE.OLEDB.12.0;"  "Data Source="  + filePath +  ";"  ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"" ;
            }
            string  sql_F =  "Select * FROM [{0}]" ;
 
            OleDbConnection conn =  null ;
 
            OleDbDataAdapter da =  null ;
 
            DataTable dtSheetName =  null ;
 
            DataSet ds =  new  DataSet();
 
            try
            {
 
                // 初始化连接,并打开
 
                conn =  new  OleDbConnection(connStr);
 
                conn.Open();
 
                // 获取数据源的表定义元数据                       
 
                string  SheetName =  "" ;
 
                dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,  new  object [] {  null null null "TABLE"  });
 
                // 初始化适配器
 
                da =  new  OleDbDataAdapter();
 
                for  ( int  i = 0; i < dtSheetName.Rows.Count; i++)
                {
 
                    SheetName = ( string )dtSheetName.Rows[i][ "TABLE_NAME" ];
 
                    if  (SheetName.Contains( "$" ) && !SheetName.Replace( "'" "" ).EndsWith( "$" ))
                    {
                        continue ;
                    }
 
 
                    da.SelectCommand =  new  OleDbCommand(String.Format(sql_F, SheetName), conn);
 
                    DataSet dsItem =  new  DataSet();
 
                    da.Fill(dsItem,  "MyTable" );
                    ds.Tables.Add(dsItem.Tables[0].Copy());
 
                }
 
            }
 
            catch  (Exception ex)
            {
 
            }
            finally
            {
                // 关闭连接
                if  (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    da.Dispose();
                    conn.Dispose();
                }
 
            }
 
            return  ds;
        }
 
 
        public  void  ExcelSplit(DataTable excelTable)
        {
            //创建工作表
            HSSFWorkbook workbook =  new  HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet( "Sheet1" );
            sheet.ProtectSheet( "123" );  //加密Excel,从而实现只读
            //创建表头
            IRow headerrow = sheet.CreateRow(0);
            for  ( int  i = 0; i < excelTable.Columns.Count; i++)
            {
                headerrow.CreateCell(i).SetCellValue(excelTable.Columns[i].ColumnName);
            }
 
            int  index = 0;  //拆分个数
            //创建内容
            IRow datarow = sheet.CreateRow(1);
            FileStream stream =  null ;
            if  (!Directory.Exists( @"d:/MyXls" ))
            {
                Directory.CreateDirectory( @"d:/MyXls" );   
            }
 
            for  ( int  i = 0; i < excelTable.Rows.Count; i++)
            {
                for  ( int  j = 0; j < excelTable.Columns.Count; j++)
                {
                    ICell cell = datarow.CreateCell(j);
                    cell.SetCellValue(excelTable.Rows[i][j].ToString());
                }
                string  excelname = excelTable.Rows[i][ "姓名" ].ToString()+ "_" +DateTime.Now.ToString( "yyyy-MM" )+  ".xls" ;
                stream =  new  FileStream( @"d:/MyXls/"  + excelname, FileMode.Create);
                workbook.Write(stream);
               
                index++;
            }
            stream.Close();
            
            this .toolStripStatusLabel1.Text =  "共拆分工资条:"  + index +  "条" ;
            this .Cursor = Cursors.Default;
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值