C# Excel导入导出

在这里插入图片描述

速度慢,效率低,问题多

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();				//导出的Datetable
    string 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;
        }
        //实例化sheet
        ISheet 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 第一行索引 0
        IRow 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 最后一行的索引 如第九行---索引 8
        for (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 案例

扫描二维码关注公众号,回复: 12578171 查看本文章

VB NPOI导入导出数据

Excel—>datatable

Private Sub BTN_01_Click(sender As Object, e As EventArgs) Handles BTN_01.Click
   Dim dtNpoi As New DataTable                  '导出的Datetable
   Dim fileName As String = "C:\Users\Alienware\Desktop\123.xls"
   Dim sheetName As String = "sheet1" '工作表
   Dim isColumnName As Boolean = True
   Dim 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) Then
           workBook = New HSSFWorkbook(fs)
       Else
           workBook = Nothing
       End If
       '实例化sheet
       Dim sheet As ISheet
       If Not String.IsNullOrEmpty(sheetName) Then
           sheet = workBook.GetSheet(sheetName)        '获取指定sheet名称的工作表
           If sheet.Equals(Nothing) Then
               sheet = workBook.GetSheetAt(0)          '获取第一个工作表 索引从0开始
           End If
       Else
           sheet = workBook.GetSheetAt(0)              '获取第一个工作表
       End If
       '获取表头 FirstRowNum 第一行索引 0
       Dim 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) Then
                       Dim col As New DataColumn(CellValue)
                       dtNpoi.Columns.Add(col)
                   Else
                       Dim col As New DataColumn(CellValue)
                       dtNpoi.Columns.Add(col)
                   End If
               End If
           Next
       End If
       '数据   LastRowNum=8 最后一行的索引 九行---索引 0-8
       For i = startRow To sheet.LastRowNum
           Dim row As IRow = sheet.GetRow(i)       '获取第i行
           If row.Equals(Nothing) Then
               Continue For
           End If
           Dim dr As DataRow = dtNpoi.NewRow()
           '遍历每行的单元格
           For j = row.FirstCellNum To row.LastCellNum - 1
               If Not row.GetCell(j).Equals(Nothing) Then
                   dr(j) = row.GetCell(j).ToString()
               End If
           Next
           dtNpoi.Rows.Add(dr)  '添加行
       Next
   End Using
   dgrid.DataSource = dtNpoi '数据赋值到datatable
End Sub

datatable—>Excel

Private Sub BTN_02_Click(sender As Object, e As EventArgs) Handles BTN_02.Click
  Dim dtTable As DataTable = dgrid.DataSource            	'需要导出的数据
  Dim sheetName As String = "导出数据"                         	'sheet名
  Dim wb As IWorkbook = New HSSFWorkbook()        		'创建一个工作簿对象
  Dim sheet As ISheet           				'创建一个工作表实例
  If String.IsNullOrEmpty(sheetName) Then
      sheet = wb.CreateSheet("sheet1")
  Else
      sheet = wb.CreateSheet(sheetName)
  End If
  If dtTable.Columns.Count > 0 Then
      Dim 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.Thick
      cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.DashDotDot
      cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.MediumDashDotDot
      sheet.AddMergedRegion(New CellRangeAddress(0, 0, 0, 1))               '合并单元格
      sheet.AddMergedRegion(New CellRangeAddress(0, 0, 2, 3))              '(行,行,列,列)
      Dim row As IRow
      row = 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 = cellStyle
      cell2.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 Using
      MessageBox.Show("导出成功!")
  End If

猜你喜欢

转载自blog.csdn.net/asdasd1fdsyrt/article/details/113095232