C#IO之导入导出Excel的多种方式
一.基本介绍:
今天给大家带来的是Excel导入导出的多种实现方式,以及他们的各自的优势以及劣势,首先第一种方式是使用Office组件的方式 ,第二种方式是使用OleDb以及StreamWriter进行Excel的导入导出,第三中方式是使用NPIO进行Excel的导入导出。
二.第一种方式:使用Office组件进行导入导出
导入:
public void ioExcel() {
DataTable dt = new DataTable();
string fileName = @"d:\测试.xlsx";
APExcel.Application exApp = new APExcel.Application(); //excel应用
APExcel.Workbooks wbs = exApp.Workbooks; //Excel的工作簿集合
APExcel._Workbook _wbk = null; //excel的一个工作簿文件
try
{
//打开一个已有的Excel的文件
_wbk = wbs.Add(fileName);
APExcel.Worksheet sheet = _wbk.Sheets["sheet1"];
int rowCounts = sheet.UsedRange.Rows.Count;
int columnsCounts = sheet.UsedRange.Columns.Count;
//获取列Excel工作表的第一列为列名,索引从1开始
for (int i = 1; i <= columnsCounts; i++)
{
dt.Columns.Add(((APExcel.Range)sheet.Cells[1, i]).Value());
}
for (int i = 2; i <= rowCounts; i++)
{
DataRow dr = dt.NewRow();
for (int j = 1; j <= columnsCounts; j++)
{
dr[j - 1] = ((APExcel.Range)sheet.Cells[i, j]).Value();
}
dt.Rows.Add(dr);
}
}
catch (Exception e)
{
//记录日志
}
finally {
_wbk.Close();
wbs.Close();
exApp.Quit();
}
导出:
public void OutputExcel(DataTable Data)
{
APExcel.Application exApp = new APExcel.Application(); //excel应用
APExcel.Workbooks wbs = exApp.Workbooks; //Excel的工作簿集合
APExcel._Workbook _wbk = null; //excel的一个工作簿文件
try
{
_wbk = wbs.Add(true); //新建一个Excel工作簿文件
//取得第一个工作表
APExcel.Worksheet sheet = _wbk.Sheets[1];
sheet.Name = "测试数据";
//第一行:写入列名
for (int i = 0; i < Data.Columns.Count; i++)
{
APExcel.Range r = sheet.Cells[1, i + 1];
r.Value = Data.Columns[i].ColumnName;
}
for (int i = 0; i < Data.Rows.Count; i++)
{
for (int j = 0; j < Data.Columns.Count; j++)
{
APExcel.Range r = sheet.Cells[i + 2, j + 1];
r.Value = Data.Rows[i][j].ToString();
}
}
exApp.DisplayAlerts = false;
_wbk.Saved = true;
_wbk.SaveCopyAs(@"d:\\测试数据11.xlsx");
}
catch (Exception E)
{
//
}
finally
{
_wbk.Close();
wbs.Close();
exApp.Quit();
}
}
缺点:
速度慢,问题多,效率低-----废弃
三.第二种方式:OleDb导入,StreamWriter进行导出写入Excel
导入:
public void InPutExcel(string FileName)
{
string extensionName = Path.GetExtension(FileName);
string strCon = null;
if (extensionName == ".xls")
{
strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties='Excel8.0;HDR=YES;IMEX=1'";
}
else
{
strCon = @"Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel12.0;HDR=YES;IMEX=1'";
}
//OLEDB 是建立在ODBC功能之上的开发规范,ODBC是为了访问关系型数据库进行而专门开发的而OLEDB是用于访问关系型和非关系型数据源
//整体过程相当于连接数据库访问数据表的过程
DataTable dt = new DataTable();
using (OleDbConnection conn = new OleDbConnection(strCon))
{
conn.Open();
DataTable dtNames = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
string shName = dtNames.Rows[0][2].ToString();
string sql = $"select * from {shName}";
OleDbDataAdapter da = new OleDbDataAdapter(sql, strCon);
da.Fill(dt);
}
}
导出:
public void OutPutExcel(DataTable data)
{
string path = @"d:\测试数据.xlsx";
StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Columns.Count; i++)
{
sb.Append(data.Columns[i].ColumnName + "\t");//相当于tab不能省略
}
sb.Append(Environment.NewLine);
for (int i = 0; i < data.Rows.Count; i++)
{
for (int j = 0; j < data.Columns.Count; j++)
{
sb.Append(data.Rows[i + 1][j].ToString() + "\t");
}
sb.Append(Environment.NewLine);
}
sw.Write(sb);
sw.Flush(); //将数据从暂存区刷到基础存储设备 落库
}
优缺点:
优点:加载速度比较快
缺点:受版本的限制,不同的版本链接字符串不一样
四.使用NPIO进行Excel的导入导出
优势:
导入:
public void InputExcel(string sheetName)
{
DataTable dt = new DataTable();
string fileName = @"d:\测试数据.xlsx";
bool isColumnName = true;
IWorkbook workbook;
ISheet sheet = null;
string Ext = Path.GetExtension(fileName).ToLower();
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Read))
{
if (Ext == ".xls")
{
workbook = new HSSFWorkbook(fs);
}
else if (Ext == ".xlsx")
{
workbook = new HSSFWorkbook(fs);
}
else
{
workbook = null;
}
}
if (string.IsNullOrEmpty(sheetName))
{
sheet = workbook.GetSheet(sheetName);
if (sheet == null)
{
workbook.GetSheetAt(0);
}
}
else
{
workbook.GetSheetAt(0);
}
//获取表头 FirstRowNum 第一行索引0
IRow header = sheet.GetRow(sheet.FirstRowNum);
int StartRow = 0; //数据的第一行索引
if (isColumnName)
{//表示第一行是列名的信息
StartRow = sheet.FirstRowNum + 1;
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 dc = new DataColumn(cellValue);
dt.Columns.Add(dc);
}
else {
DataColumn dc = new DataColumn(cellValue);
dt.Columns.Add(dc);
}
}
}
//数据 LastRowNum 最后一行的索引如第九行的索引---8
for (int i = StartRow; i < sheet.LastRowNum; i++) {
IRow row = sheet.GetRow(i);
if (row == null) {
continue;
}
DataRow dr = dt.NewRow();
//遍历每行的单元格
for (int j = row.FirstCellNum; j < row.LastCellNum; j++) {
if (row.GetCell(j) != null) {
dr[j] = row.GetCell(j).ToString();
}
}
dt.Rows.Add(dr);
}
}
}
导出:
public void OutPutExcel(DataTable data)
{
string sheetName = "测试数据";
//创建一个工作簿对象
IWorkbook workBook = new HSSFWorkbook();
//创建一个工作表的实例
ISheet sheet = string.IsNullOrEmpty(sheetName) ? workBook.GetSheet("sheet1") : workBook.GetSheet(sheetName);
int rowIndex = 0;
if (data.Columns.Count > 0)
{
IRow header = sheet.GetRow(rowIndex); //创建第一行
//设置列名
for (int i = 0; i < data.Columns.Count; i++)
{
ICell cell = header.CreateCell(i); //创建单元格
cell.SetCellValue(data.Columns[i].ColumnName);//设置单元格的值
}
}
//添加数据
if (data.Rows.Count > 0)
{
for (int i = 0; i < data.Rows.Count; i++)
{
rowIndex++;
IRow row = sheet.GetRow(rowIndex);
for (int j = 0; j < data.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);//创建单元格
cell.SetCellValue(data.Rows[i][j].ToString()); //设置值
}
}
}
for (int i = 0; i < data.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}
using (FileStream fs = new FileStream(@"d:\测试数据11.xlsx", FileMode.Create, FileAccess.Write))
{
workBook.Write(fs); //写入指定的路径 创建excel文件
}
}
总结:
我们介绍了目前主要使用的几种进行Excel的导入导出的方式,并且进行他们使用的简单的举例子,目前我们使用最为广泛的Excel,Word的操作,使用的还是NPOI的方式,我们也进行了NPOI的基本介绍列举了他的优点,前两种方式可以作为了解进行学习,主要是掌握最后一种方法即可。