速度慢,效率低,问题多
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使用教程
扫描二维码关注公众号,回复:
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