速度慢,效率低,问题多

1.1 Excel–>DateTable

//引用命名空间
using ApExcel = Microsoft.Office.Interop.Excel;
private void btnAppToDataTable_Click(object sender, EventArgs e)
{DataTable dt = new DataTable();string fileName = @"d:\库存变动信息.xlsx";ApExcel.Application exApp = new ApExcel.Application();ApExcel.Workbooks wbs = exApp.Workbooks;    //Excel工作簿集合ApExcel._Workbook _wbk = null;              //_Workbook--一个Excel工作簿文件try{//打开一个已有Excel文件_wbk = wbs.Add(fileName);ApExcel.Worksheet sheet = _wbk.Sheets["sheet1"];int rcount = sheet.UsedRange.Rows.Count;int colcount = sheet.UsedRange.Columns.Count;//获取列  Excel工作表的第一行为列名 索引从1开始for (int i = 1; i <= colcount; i++){dt.Columns.Add(((ApExcel.Range)sheet.Cells[1, i]).Value);//添加列}for (int i = 2; i <= rcount; i++)//数据从第二行开始{DataRow dr = dt.NewRow();for (int j = 1; j <= colcount; j++){//dt的索引从0开始dr[j - 1] = ((ApExcel.Range)sheet.Cells[i, j]).Value;}dt.Rows.Add(dr);}}catch (Exception ex){MessageBox.Show(ex.Message);}finally{_wbk.Close();wbs.Close();exApp.Quit();}dgvList.DataSource = dt;     //绑定数据
}

1.2 DateTablel–>Excel

private void btnAppToExcel_Click(object sender, EventArgs e)
{DataTable dt = dgvList.DataSource as DataTable;ApExcel.Application exApp = new ApExcel.Application();ApExcel.Workbooks wbs = exApp.Workbooks;//Excel工作簿集合ApExcel._Workbook _wbk = null;//_Workbook--一个Excel工作簿文件try{//新建一个工作簿 就是新建一个Excel文件_wbk = wbs.Add(true);//取得第一个工作表ApExcel.Worksheet sheet = _wbk.Sheets[1];sheet.Name = "变动明细数据";for (int i = 0; i < dt.Columns.Count; i++){ApExcel.Range r = sheet.Cells[1, i + 1];r.Value = dt.Columns[i].ColumnName;}for (int i = 0; i < dt.Rows.Count; i++){for (int j = 0; j < dt.Columns.Count; j++){ApExcel.Range r = sheet.Cells[i + 2, j + 1];r.Value = dt.Rows[i][j].ToString();}}exApp.DisplayAlerts = false;_wbk.Saved = true;_wbk.SaveCopyAs(@"d:\库存变动明细_导出.xls");MessageBox.Show("导出完毕!");}catch (Exception ex){MessageBox.Show(ex.Message);}finally{_wbk.Close();wbs.Close();exApp.Quit();}
}

这种导入方式,类似于将数据库中的一张表填充到DataTable中。
这种方式,加载速度快,但受版本限制,不同版本的Excel文件,连接字符串有差别
//IMEX=0 表示 Excel只能用作写入  1 只能作读取  2 读写都可
//HDR =Yes 第一行是标题,No 第一行是数据,不是标题
//如果是.xls 即07以下的版本,连接字符串
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excel_path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
//如果是.xlsx 07即以上的版本
strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel_path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";

2.1 Excel–>DateTable

//引用命名空间
using System.Data;
using System.Data.OleDb;
private void btnOledbToDataTable_Click(object sender, EventArgs e)
{string excel_path = @"d:\区域数据.xlsx";string strConn = "";string ext = Path.GetExtension(excel_path);//获取后缀名if (ext==".xls"){//如果是.xls 即07以下的版本,连接字符串strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excel_path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";}else{//如果是.xlsx 07即以上的版本strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel_path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";}DataTable dtNew = new DataTable();//导出的DataTable//以下就是读取Excel数据的方式using (OleDbConnection conn = new OleDbConnection(strConn)){conn.Open();//得到所有Sheet的名字DataTable dtNames = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });string shName = dtNames.Rows[0][2].ToString();//获取第一个Sheet的名字string sql = "select * from [" + shName + "]";//查询工作表的数据OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);da.Fill(dtNew);}MessageBox.Show("导入成功!");dgvList.DataSource = dtNew;//DataTable数据绑定到DataGrid}

2.2 DateTablel–>Excel

private void btnDataTableToExcel_Click(object sender, EventArgs e)
{DataTable dt = dgvList.DataSource as DataTable;//得到DataGrid中的数据//写入流StreamWriter sw = new StreamWriter(@"d:\区域数据_导出.xls", false, Encoding.GetEncoding("gb2312"));StringBuilder sb = new StringBuilder();//可变长字符串 这个Append方式 比字符串拼接效率高//表名for (int i = 0; i < dt.Columns.Count; i++){sb.Append(dt.Columns[i].ColumnName + "\t");// \t 相当于tab键 不能漏掉,写到每一个单元格}sb.Append(Environment.NewLine);//换行//表数据for (int i = 0; i < dt.Rows.Count; i++){for (int j = 0; j < dt.Columns.Count; j++){sb.Append(dt.Rows[i][j].ToString() + "\t");}sb.Append(Environment.NewLine);//换行}sw.Write(sb.ToString());//将字符串写入当前流sw.Flush();//写入文件sw.Close();//关闭MessageBox.Show("导出完毕!");}

NPOI是指构建在POI 3.x版本之上的一个程序,
NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作,
包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)。
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。


3.1 Excel–>DateTable

//引用命名空间
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using ApExcel = Microsoft.Office.Interop.Excel;
using BorderStyle = NPOI.SS.UserModel.BorderStyle;
private void btnNPOIToDataTable_Click(object sender, EventArgs e)
{DataTable dtNpoi = new DataTable();               //导出的Datetablestring fileName = @"C:\Users\Alienware\Desktop\123.xlsx";string sheetName = "sheet1";bool isColumnName = true;                    //是否有表头IWorkbook workBook;                      //工作簿string fileExt = Path.GetExtension(fileName).ToLower();   //获取扩展名using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//创建工作簿//XSSFWorkbook 适用xlsx格式 HSSFWorkbook 适用xls格式if (fileExt == ".xlsx"){workBook = new XSSFWorkbook(fs);}else if (fileExt == ".xls"){workBook = new HSSFWorkbook(fs);}else{workBook = null;}//实例化sheetISheet sheet = null;if (sheetName != null && sheetName != ""){sheet = workBook.GetSheet(sheetName);  //获取指定sheet名称的工作表if (sheet == null)sheet = workBook.GetSheetAt(0);       //获取第一个工作表 索引从0开始}else{sheet = workBook.GetSheetAt(0);     //获取第一个工作表}//获取表头 FirstRowNum 第一行索引 0IRow header = sheet.GetRow(sheet.FirstRowNum);    //获取第一行int startRow = 0;//数据的第一行索引if (isColumnName)//表示第一行是列名信息{startRow = sheet.FirstRowNum + 1;//遍历第一行的单元格   得到列名 0             4 一行有4个单元格 for (int i = header.FirstCellNum; i < header.LastCellNum; i++){//获取指定索引的单元格ICell cell = header.GetCell(i);if (cell != null){//获取列名的值string cellValue = cell.ToString();//添加列if (cellValue != null){DataColumn col = new DataColumn(cellValue);dtNpoi.Columns.Add(col);}else{DataColumn col = new DataColumn();dtNpoi.Columns.Add(col);}}}}//数据    LastRowNum 最后一行的索引 如第九行---索引 8for (int i = startRow; i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);//获取第i行if (row == null){continue;}DataRow dr = dtNpoi.NewRow();//遍历每行的单元格for (int j = row.FirstCellNum; j < row.LastCellNum; j++){if (row.GetCell(j) != null)dr[j] = row.GetCell(j).ToString();}dtNpoi.Rows.Add(dr);}}dgvList.DataSource = dtNpoi;        //绑定数据
}

3.2 DateTablel–>Excel

public static void NPOIDataTableToExcel(DataTable dt, string fileName,string sheetName)
{  DataTable dtTable = dgvList.DataSource as DataTable;    //需要导出的数据string sheetName = "导出数据";              //sheet名IWorkbook wb = new XSSFWorkbook();             //创建一个工作簿对象//创建一个工作表实例ISheet sheet = string.IsNullOrEmpty(sheetName) ? wb.CreateSheet("sheet1") : wb.CreateSheet(sheetName);int rowIndex = 0;if (dt.Columns.Count > 0){IRow header = sheet.CreateRow(rowIndex);     //创建第一行//header.Height = 20;//设置行高//设置列名for (int i = 0; i < dt.Columns.Count; i++){ICell cell = header.CreateCell(i);       //创建单元格cell.SetCellValue(dt.Columns[i].ColumnName);//设置单元格的值}}//添加数据if (dt.Rows.Count > 0){for (int i = 0; i < dt.Rows.Count; i++){rowIndex++;IRow row = sheet.CreateRow(rowIndex);for (int j = 0; j < dt.Columns.Count; j++){ICell cell = row.CreateCell(j);            //创建单元格cell.SetCellValue(dt.Rows[i][j].ToString()); //设置值}}}for (int i = 0; i < dt.Columns.Count; i++){sheet.AutoSizeColumn(i);           //自适应单元格大小}string fileName = @"d:\导出NPOI.xlsx";using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)){wb.Write(fs);           //将工作簿写入流}MessageBox.Show("导出成功!");
}
为单元格附上样式
ICellStyle cellStyle = wb.CreateCellStyle() ;                 //声明样式
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;    //水平居中
cellStyle.VerticalAlignment = VerticalAlignment.Center;            //垂直居中
IFont font = wb.CreateFont();                                //声明字体
font.Boldweight = (Int16)FontBoldWeight.Bold;              //加粗
font.FontHeightInPoints = 18;                      //字体大小
cellStyle.SetFont(font);                    //样式应用到单元格
//cellStyle.BorderDiagonalLineStyle = BorderStyle.Thick;
//cellStyle.BorderDiagonal = BorderDiagonal.Both;
//cellStyle.BorderDiagonalColor = IndexedColors.Red.Index;
cellStyle.BorderLeft = BorderStyle.Thick;                   //边框样式
cellStyle.BorderTop = BorderStyle.Thick;
cellStyle.BorderRight = BorderStyle.DashDotDot;
cellStyle.BorderBottom = BorderStyle.MediumDashDotDot;
//合并单元格(第几行,到第几行,第几列,到第几列)
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 1));
IRow row0 = sheet.CreateRow(0);                    //创建行
//row0.HeightInPoints = 50;        //行高
//row0.SetColumnWidth(1, 30 * 256); //设置列宽
ICell cell0 = row0.CreateCell(0);          //创建单元格
ICell cell1 = row0.CreateCell(1);
ICell cell2 = row0.CreateCell(2);
cell0.SetCellValue("姓名");                         //赋值
//cell1.SetCellValue("");
cell2.SetCellValue("年龄");
cell0.CellStyle = cellStyle;               //设置样式
cell1.CellStyle = cellStyle;
cell2.CellStyle = cellStyle;                 


①边框线样式

NPOI 2.0使用教程

NPOI 案例

VB NPOI导入导出数据

Excel—>datatable

Private Sub BTN_01_Click(sender As Object, e As EventArgs) Handles BTN_01.ClickDim dtNpoi As New DataTable                  '导出的DatetableDim fileName As String = "C:\Users\Alienware\Desktop\123.xls"Dim sheetName As String = "sheet1" '工作表Dim isColumnName As Boolean = TrueDim workBook As IWorkbook            '工作簿Dim fileExt As String = Path.GetExtension(fileName).ToLower()       '获取扩展名Using fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)If ".xlsx".Equals(fileExt) Then  '创建工作簿workBook = New XSSFWorkbook(fs)ElseIf ".xls".Equals(fileExt) ThenworkBook = New HSSFWorkbook(fs)ElseworkBook = NothingEnd If'实例化sheetDim sheet As ISheetIf Not String.IsNullOrEmpty(sheetName) Thensheet = workBook.GetSheet(sheetName)        '获取指定sheet名称的工作表If sheet.Equals(Nothing) Thensheet = workBook.GetSheetAt(0)          '获取第一个工作表 索引从0开始End IfElsesheet = workBook.GetSheetAt(0)              '获取第一个工作表End If'获取表头 FirstRowNum 第一行索引 0Dim header As IRow = sheet.GetRow(sheet.FirstRowNum)    '获取第一行Dim startRow As Integer = 0                      '数据的第一行索引If isColumnName Then                          '表示第一行是列名信息startRow = sheet.FirstRowNum + 1'遍历第一行的单元格  列名 0-3  LastCellNum=4一行有4个单元格 For i = header.FirstCellNum To header.LastCellNum - 1'获取指定索引的单元格Dim cell As ICell = header.GetCell(i)If Not cell.Equals(Nothing) Then'获取列名的值Dim CellValue As String = cell.ToString()If Not CellValue.Equals(Nothing) ThenDim col As New DataColumn(CellValue)dtNpoi.Columns.Add(col)ElseDim col As New DataColumn(CellValue)dtNpoi.Columns.Add(col)End IfEnd IfNextEnd If'数据   LastRowNum=8 最后一行的索引 九行---索引 0-8For i = startRow To sheet.LastRowNumDim row As IRow = sheet.GetRow(i)       '获取第i行If row.Equals(Nothing) ThenContinue ForEnd IfDim dr As DataRow = dtNpoi.NewRow()'遍历每行的单元格For j = row.FirstCellNum To row.LastCellNum - 1If Not row.GetCell(j).Equals(Nothing) Thendr(j) = row.GetCell(j).ToString()End IfNextdtNpoi.Rows.Add(dr)  '添加行NextEnd Usingdgrid.DataSource = dtNpoi '数据赋值到datatable
End Sub

datatable—>Excel

Private Sub BTN_02_Click(sender As Object, e As EventArgs) Handles BTN_02.ClickDim dtTable As DataTable = dgrid.DataSource              '需要导出的数据Dim sheetName As String = "导出数据"                            'sheet名Dim wb As IWorkbook = New HSSFWorkbook()               '创建一个工作簿对象Dim sheet As ISheet                          '创建一个工作表实例If String.IsNullOrEmpty(sheetName) Thensheet = wb.CreateSheet("sheet1")Elsesheet = wb.CreateSheet(sheetName)End IfIf dtTable.Columns.Count > 0 ThenDim cellStyle As ICellStyle = wb.CreateCellStyle()                  '声明样式cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center  '水平居中cellStyle.VerticalAlignment = VerticalAlignment.Center              '垂直居中Dim Font As IFont = wb.CreateFont()              '字体'Font.Boldweight = Convert.ToInt16(FontBoldWeight.Bold)     '加粗Font.FontHeightInPoints = 18                                '字体大小cellStyle.SetFont(Font)                                     '单元格应用字体cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thick          '边框线样式cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.ThickcellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.DashDotDotcellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.MediumDashDotDotsheet.AddMergedRegion(New CellRangeAddress(0, 0, 0, 1))               '合并单元格sheet.AddMergedRegion(New CellRangeAddress(0, 0, 2, 3))              '(行,行,列,列)Dim row As IRowrow = sheet.CreateRow(0)                                '创建行row.HeightInPoints = 50                                 '行高Dim cell0 As ICell = row.CreateCell(0)                '创建单元格Dim cell1 As ICell = row.CreateCell(1)Dim cell2 As ICell = row.CreateCell(2)cell0.SetCellValue("姓名")                               '赋值'cell1.SetCellValue("")           '如单元格合并了,前面的值会覆盖后面的值,后面的值可以不赋,或者赋为空值cell2.SetCellValue("年龄")cell0.CellStyle = cellStyle         '赋上样式cell1.CellStyle = cellStylecell2.CellStyle = cellStyle  cell2.SetCellValue("年龄")Dim fileName As String = "d:\导出数据_NPOI.xls"Using fs As New FileStream(fileName, FileMode.Create, FileAccess.Write)wb.Write(fs)       '将工作簿写入流End UsingMessageBox.Show("导出成功!")End If

C# Excel导入导出相关推荐

  1. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

  2. java超级简单到爆的Excel导入导出(easypoi)

    场景: 在日常工作中,excel导入导出,是十分常见的,有两种主流的技术,一种是jxl,另一种是poi,而easypoi就是对poi进行了封装,使得导入导出变得更加的简单,阿里巴巴也有封装的工具名叫E ...

  3. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  4. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单

    做积极的人,而不是积极废人! 来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结 EasyExcel 在做exc ...

  5. excel winform 导入 导出_强大的 Excel 导入导出工具 hutool

    " 最近项目上需要用到 Excel 的导入导出功能,想着之前使用的都有点麻烦,所以结合多方资料,终于找到了这个还算不错的 Excel 处理工具,一起来看" 今日安利好物名为 Hut ...

  6. easypoi 多sheet导入_程序员接私活利器 玩转excel导入导出

    为什么会写Easypoi 以前的以前(岁月真TMD的快)我虽然写了不少代码但还是很少写poi,然后跳到一家公司之后就和业务人员聊上了,来这个需要个报表,这个报表样式是这样的,这个表头是这样的,就这样我 ...

  7. SpringBoot集成EasyPoi实现Excel导入导出

    作者介绍: 本人Java特工,代号:Cris Li : 中文名:克瑞斯理 简书地址: 消失的码农 - 简书 CSDN地址: https://blog.csdn.net/jianli95 个人纯洁版博客 ...

  8. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!

    在我们平时工作中经常会遇到要操作Excel的功能,比如导出个用户信息或者订单信息的Excel报表.你肯定听说过POI这个东西,可以实现.但是POI实现的API确实很麻烦,它需要写那种逐行解析的代码(类 ...

  9. 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    最近闲了,花点几天时间将项目中常用的一些类.方法做了一下总结,希望对大家有用. 实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回fa ...

  10. Excel导入导出帮助类

    /// <summary>     /// Excel导入导出帮助类     /// 记得引入 NPOI     /// 下载地址   http://npoi.codeplex.com/r ...

最新文章

  1. 程序员的“凡尔赛文学”大赏!
  2. 为何互联网大厂热衷于春节撒红包?谁才是最大赢家?
  3. android map数据更新数据,Android Intent Map 数据被覆盖
  4. JMeter性能测试入门
  5. leetcode35. 搜索插入位置(二分搜索)
  6. IDEA的Struts2项目报错java.lang.ClassNotFoundException
  7. HTML+CSS实现品优购登录界面
  8. linux 下的挂载
  9. 在CentOS上安装Git(转)
  10. Quartz时间配置(周期任务类)
  11. java环境安装包_超详细的EFK安装部署教程--环境准备篇
  12. 瑞萨RH850F1L用户手册(UM)LIN master接口章节 中文翻译(Section 6 Exceptions/Interrupts(异常/中断))
  13. css内联样式!important
  14. 快速破解基于linux内核的开源路由器后台管理登录密码
  15. yolov5 训练结果解析
  16. 厌倦了996模式?来看看国内995制度的公司!
  17. docker 中文乱码解决
  18. vue 请求后台数据
  19. 分享一款 浏览器密码查看器
  20. php 连接 ldap 实例,使用PHP连接LDAP服务器

热门文章

  1. 狂野飙车氮气加速java游戏_狂野飙车氮气加速游戏模式大解析 多种体验乐趣无穷...
  2. 变量在linux中的作用是什么意思,浅谈linux变量
  3. matlab实现曲线积分(path_integral函数)
  4. metric--路由度量值
  5. Java –如何延迟几秒钟
  6. Palm Web OS 简介
  7. CQNKOJ P5215 智力大冲浪(贪心算法)题解
  8. matlab_批量修改文件前缀或后缀
  9. kof97调隐藏人物
  10. python中一切内容都可以称为_创业基础答案黑龙江大学