在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.前言相信大家在工作中经常要遇到一些导入导出Execl操作。学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用。 NPOI:是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。 它不使用Office COM组件(Microsoft.Office.Interop.XXX.dll),不需要安装Microsoft Office,支持对Office 97-2003的文件格式,功能比较强大。 能够读写几乎所有的Office 97-2003文件格式,至少能够支持Word, PowerPoint, Excel, Visio的格式。 1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。 2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下: HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。 HSSFWorkbook对应的就是Excel文件 工作簿, HSSFSheet对应的就是Excel中sheet 工作表, HSSFCell对应的就是Excel的单元格, HSSFRow对应的就是Excel的行 .NET调用NPOI组件导入导出Excel的操作类 此NPOI操作类的优点如下: 2.简单用法namespace 导入导出 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnInput_Click(object sender, EventArgs e) { #region 导入到DataTable using (FileStream stream = File.OpenRead("huangjinfeng.xls")) { IWorkbook workbook = new HSSFWorkbook(stream); ISheet sheet = workbook.GetSheet("员工捐款信息表"); DataTable table = new DataTable(); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; int rowCount = sheet.LastRowNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); if (row != null) { for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j); } } table.Rows.Add(dataRow); } this.dataGridView1.DataSource = table; MessageBox.Show("导入数据成功"); } #endregion #region 导入到数据库 //using (FileStream stream = File.OpenRead("huangjinfeng.xls")) //{ // string sql="INSERT INTO [dbo].[DonationDetail]([dUserName],[dcID],[dAmount],[dDate],[disdelete],[dCreateTime])"; // RenderToDb(stream,sql); // MessageBox.Show("SQL"); //} #endregion } private void btnOut_Click(object sender, EventArgs e) { DonationEntities2 db = new DonationEntities2(); var lists = db.CreateObjectSet<DonationDetail>().Where(c => c.disdelete == 0).ToList(); #region 自由导出 HSSFWorkbook workbook = new HSSFWorkbook(); //2.创建工作表 ISheet sheet = workbook.CreateSheet("员工捐款信息表"); IRow rowHeader = sheet.CreateRow(0); rowHeader.CreateCell(0, CellType.String).SetCellValue("DId"); rowHeader.CreateCell(1, CellType.String).SetCellValue("员工姓名"); rowHeader.CreateCell(2, CellType.String).SetCellValue("DcId"); rowHeader.CreateCell(3, CellType.String).SetCellValue("捐款金额"); rowHeader.CreateCell(4, CellType.String).SetCellValue("捐款日期"); rowHeader.CreateCell(5, CellType.String).SetCellValue("是否删除"); rowHeader.CreateCell(6, CellType.String).SetCellValue("创建日期"); for (int i = 0; i < lists.Count; i++) { IRow row = sheet.CreateRow(i + 1); //为指定的行添加列 row.CreateCell(0, CellType.String).SetCellValue(lists[i].dId); row.CreateCell(1, CellType.String).SetCellValue(lists[i].dUserName); row.CreateCell(2, CellType.String).SetCellValue(lists[i].dcID); row.CreateCell(3, CellType.String).SetCellValue(lists[i].dAmount.ToString()); row.CreateCell(4, CellType.String).SetCellValue(Convert.ToDateTime(lists[i].dDate.ToString())); row.CreateCell(5, CellType.String).SetCellValue(lists[i].disdelete); row.CreateCell(6, CellType.String).SetCellValue(Convert.ToDateTime(lists[i].dCreateTime.ToString())); } //使用文件流做数据的写入 using (FileStream fss = new FileStream("huangjinfeng.xls", FileMode.Create)) { workbook.Write(fss); } MessageBox.Show("导出数据成功"); #endregion }
RenderToDb(Stream excelFileStream, string insertSql)
HasData(Stream excelFileStream)
} } 3.项目中的Execl导入导出工作中我一般主要是用到的MVC,在这里就说说我们项目中一般的处理过程。先看看我自己写的一个NPOIBase父类。 public class NPOIBase : ActionResult { public IWorkbook _workbook { get; set; } public ISheet _sheet { get; set; } public ICellStyle _titleStyle { get; set; } public ICellStyle _leftStyle { get; set; } public ICellStyle _centerStyle { get; set; } public ICellStyle _rightStyle { get; set; } public ICellStyle _headStyle { get; set; } public ICellStyle _leftborderStyle { get; set; } public ICellStyle _rightborderStyle { get; set; } public ICellStyle _noneRightBorderStyle { get; set; } public ICellStyle _noneLeftBorderStyle { get; set; } public ICellStyle _noneLeftAndRightBorderStyle { get; set; } public ICellStyle _borderStyle { get; set; }
IniStyle
public void FillHeadCell(IRow row, int colIndex, string value, ICellStyle cellStyle = null, 这个由于父类是继承的ActionResult,我们用起来就比较方便,在Action中,直接使用就可以了。代码示例如下... public class BaseMaterialsExcelResult : NPOIBase { string[] __headers = null; IList<BaseMaterials> __BaseMaterialsList; public BaseMaterialsExcelResult(IList<BaseMaterials> BaseMaterialsList) { __BaseMaterialsList = BaseMaterialsList; __headers = new string[] { "序号", "材料", "型号", "推荐供应商", "出库数量", "入库数量", "结存" }; } 控制器中的代码如下: public class HomeController : Controller { BluedonStockEntities db = new BluedonStockEntities(); public List<BaseMaterials> GetList() { return db.CreateObjectSet<BaseMaterials>().Where(c => true).ToList(); } public ActionResult Index() { var list = GetList(); return View(list); } public ActionResult Execl() { var list = GetList(); return new BaseMaterialsExcelResult(list); } } 4.问题总结。
简单用法的源码【点击下载】 MVC版的源码【点击下载】 感谢你的支持,为我点个赞吧! |
请发表评论