速度慢,效率低,问题多

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. 第3关:单链表循环队列
  2. EL:固氮能力主要取决于物种分类而不是土壤养分
  3. 如何构建一个理想UI代码表达的自动化工具?
  4. 【反传销】春节一个短暂误入传销和脱身的真实故事以及对技术的思考
  5. 错误:java.lang.Illegal Argument Exception: Document base F:/apache-tomcat-7.0.40/webapps/ web3 does no
  6. Spring Boot 2中的功能切换
  7. ajax ashx 请选择文件,ajax+jquery+ashx如何实现上传文件
  8. python-50: 验证码
  9. shell命令wc,md5sum,basename
  10. android studio程序开机启动,Android Studio中创建和启动AVD【Android】
  11. matlab均值滤波实现
  12. 一文吃透电源中的纹波、噪声和谐波
  13. Scala安装教程(最详细教程)
  14. 如何干净的卸载Mac版VMware Fusion
  15. EMC VMAX关于vault有关的概念
  16. 窗内网所有编程类视频大集合
  17. 王城英雄无限钻石服务器,王城英雄无限钻石版
  18. 操作ElasticSearch
  19. 学生使用计算机的管理制度,学生使用计算机教室管理制度
  20. About Oracle Database Performance Method

热门文章

  1. 摄像头寻找斑马线上拐点和摄像头图像压缩
  2. 智能大棚导轨式无人耕种系统设计
  3. 浅析网站的基本构成和主要类型
  4. 从入门到实战微信小程序云开发
  5. 一般机器学习策略(General Machine Learning Strategy)
  6. ECharts社区里面的gallery在哪里?ECharts gallery新地址
  7. Automa自动化爬取文本(一)
  8. Gstreamer播放教程2: Subtitle management (字幕管理)
  9. 倍福 PLC 的string操作
  10. MacBook Pro接通电源后电池不充电 Apple官方解决办法