引言

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

解决方法

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

界面预览

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

代码

 /// <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;
}

最新文章

  1. TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES
  2. Java中枚举类型简单学习
  3. EasyUI Datagrid 自定义列、Foolter及单元格编辑
  4. DSP的cache一般在何时会生效,防止在cache使用造成数据不一致
  5. 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)
  6. mysql性能优化配置总结
  7. linux的基本java环境搭建
  8. JavaSE 可变参数的方法重载
  9. Android Studio下添加assets目录
  10. js 生成随机颜色
  11. Matlab学以致用 - 曲线拟合
  12. 767A Snacktower
  13. Sqli-LABS通关笔录-8[延时注入]
  14. .NET 同步 异步 委托
  15. [003] largest_subarray_with_equal_1&amp;0
  16. .net 写魔兽登录
  17. struts2官方 中文教程 系列十三:利用通配符选择方法
  18. Hello to the cruel world
  19. CentOS 7 主机加固手册-上
  20. jQuery 事件 - trigger() 方法

热门文章

  1. yii笔一----基础,安装,结构,增删改查基本操作
  2. 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现
  3. FFT时域与频域的关系,以及采样速率与采样点的影响
  4. 基于ajax与msmq技术的消息推送功能实现
  5. SQL Server 2016 CTP2.2 安装手记
  6. .NET面试题系列[12] - C# 3.0 LINQ的准备工作
  7. ENode框架Conference案例分析系列之 - 事件溯源如何处理重构问题
  8. 初识ASP.NET Core 1.0
  9. DevExpress GridControl使用方法
  10. Go语言实战 - 创业进行时之创业伊始