c# 中wpfexcel_c# excel

该博客介绍了如何在C# WPF应用中操作Excel文件,包括使用ExcelHelper类实现Excel数据的导入导出,如DataTable到Excel的转换,以及Excel模板的使用。博客内容涉及Excel模板文件的打开、工作簿和工作表的操作,以及数据批量写入等方法。
摘要由CSDN通过智能技术生成

using System;

using System.IO;

using System.Text;

using System.Data;

using System.Reflection;

using System.Diagnostics;

using System.Collections;

//using cfg = System.Configuration;

namespace GDBI.Common

{

///

/// 说 明:Excel输出打印模块

/// 暂时不提供操作Excel对象样式方法,样式可以在Excel模板中设置好

/// 作 者:lingyun_k

/// 创建日期:2005-7-12

///

public class ExcelHelper

{

#region 成员变量

private string templetFile = null;

private string outputFile = null;

private object missing = Missing.Value;

private DateTime beforeTime; //Excel启动之前时间

private DateTime afterTime; //Excel启动之后时间

Excel.Application app;

Excel.Workbook workBook;

Excel.Worksheet workSheet;

Excel.Range range;

Excel.Range range1;

Excel.Range range2;

Excel.TextBox textBox;

private int sheetCount = 1; //WorkSheet数量

private string sheetPrefixName = "页";

#endregion

#region 公共属性

///

/// WorkSheet前缀名,比如:前缀名为“页”,那么WorkSheet名称依次为“页-1,页-2...”

///

public string SheetPrefixName

{

set { this.sheetPrefixName = value; }

}

///

/// WorkSheet数量

///

public int WorkSheetCount

{

get { return workBook.Sheets.Count; }

}

///

/// Excel模板文件路径

///

public string TempletFilePath

{

set { this.templetFile = value; }

}

///

/// 输出Excel文件路径

///

public string OutputFilePath

{

set { this.outputFile = value; }

}

#endregion

#region 公共方法

#region ExcelHelper

///

/// 构造函数,将一个已有Excel工作簿作为模板,并指定输出路径

///

/// Excel模板文件路径

/// 输出Excel文件路径

public ExcelHelper(string templetFilePath,string outputFilePath)

{

if(templetFilePath == null)

throw new Exception("Excel模板文件路径不能为空!");

if(outputFilePath == null)

throw new Exception("输出Excel文件路径不能为空!");

if(!File.Exists(templetFilePath))

throw new Exception("指定路径的Excel模板文件不存在!");

this.templetFile = templetFilePath;

this.outputFile = outputFilePath;

//创建一个Application对象并使其可见

beforeTime = DateTime.Now;

app = new Excel.ApplicationClass();

app.Visible = true;

afterTime = DateTime.Now;

//打开模板文件,得到WorkBook对象

workBook = app.Workbooks.Open(templetFile,missing,missing,missing,missing,missing,

missing,missing,missing,missing,missing,missing,missing);

//得到WorkSheet对象

workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

}

///

/// 构造函数,打开一个已有的工作簿

///

/// Excel文件名

public ExcelHelper(string fileName)

{

if(!File.Exists(fileName))

throw new Exception("指定路径的Excel文件不存在!");

//创建一个Application对象并使其可见

beforeTime = DateTime.Now;

app = new Excel.ApplicationClass();

app.Visible = true;

afterTime = DateTime.Now;

//打开一个WorkBook

workBook = app.Workbooks.Open(fileName,

Type.Missing, Type.Missing, Type.Missing, Type.Missing,

Type.Missing, Type.Missing, Type.Missing, Type.Missing,

Type.Missing, Type.Missing, Type.Missing, Type.Missing);

//得到WorkSheet对象

workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

}

///

/// 构造函数,新建一个工作簿

///

public ExcelHelper()

{

//创建一个Application对象并使其可见

beforeTime = DateTime.Now;

app = new Excel.ApplicationClass();

app.Visible = true;

afterTime = DateTime.Now;

//新建一个WorkBook

workBook = app.Workbooks.Add(Type.Missing);

//得到WorkSheet对象

workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1);

}

#endregion

#region Data Export Methods

///

/// 将DataTable数据写入Excel文件(自动分页)

///

/// DataTable

/// 每个WorkSheet写入多少行数据

/// 表格数据起始行索引

/// 表格数据起始列索引

public void DataTableToExcel(DataTable dt,int rows,int top,int left)

{

int rowCount = dt.Rows.Count; //DataTable行数

int colCount = dt.Columns.Count; //DataTable列数

sheetCount = this.GetSheetCount(rowCount,rows); //WorkSheet个数

// StringBuilder sb;

//复制sheetCount-1个WorkSheet对象

for(int i=1;i

{

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Copy(missing,workBook.Worksheets[i]);

}

for(int i=1;i<=sheetCount;i++)

{

int startRow = (i - 1) * rows; //记录起始行索引

int endRow = i * rows; //记录结束行索引

//若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数

if(i == sheetCount)

endRow = rowCount;

//获取要写入数据的WorkSheet对象,并重命名

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Name = sheetPrefixName + "-" + i.ToString();

//将dt中的数据写入WorkSheet

// for(int j=0;j

// {

// for(int k=0;k

// {

// workSheet.Cells[top + j,left + k] = dt.Rows[startRow + j][k].ToString();

// }

// }

//利用二维数组批量写入

int row = endRow-startRow;

string[,] ss = new string[row,colCount];

for(int j=0;j

{

for(int k=0;k

{

ss[j,k] = dt.Rows[startRow + j][k].ToString();

}

}

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(row,colCount);

range.Value = ss;

#region 利用Windwo粘贴板批量拷贝数据(在Web下面行不通)

/*sb = new StringBuilder();

for(int j=0;j

{

for(int k=0;k

{

sb.Append( dt.Rows[startRow + j][k].ToString() );

sb.Append("\t");

}

sb.Append("\n");

}

System.Windows.Forms.Clipboard.SetDataObject(sb.ToString());

range = (Excel.Range)workSheet.Cells[top,left];

workSheet.Paste(range,false);*/

#endregion

}

}

///

/// 将DataTable数据写入Excel文件(不分页)

///

/// DataTable

/// 表格数据起始行索引

/// 表格数据起始列索引

public void DataTableToExcel(DataTable dt,int top,int left)

{

int rowCount = dt.Rows.Count; //DataTable行数

int colCount = dt.Columns.Count; //DataTable列数

//利用二维数组批量写入

string[,] arr = new string[rowCount,colCount];

for(int j=0;j

{

for(int k=0;k

{

arr[j,k] = dt.Rows[j][k].ToString();

}

}

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(rowCount,colCount);

range.Value = arr;

}

///

/// 将DataTable数据写入Excel文件(自动分页,并指定要合并的列索引)

///

/// DataTable

/// 每个WorkSheet写入多少行数据

/// 表格数据起始行索引

/// 表格数据起始列索引

/// DataTable中要合并相同行的列索引,从0开始

public void DataTableToExcel(DataTable dt,int rows,int top,int left,int mergeColumnIndex)

{

int rowCount = dt.Rows.Count; //源DataTable行数

int colCount = dt.Columns.Count; //源DataTable列数

sheetCount = this.GetSheetCount(rowCount,rows); //WorkSheet个数

// StringBuilder sb;

//复制sheetCount-1个WorkSheet对象

for(int i=1;i

{

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Copy(missing,workBook.Worksheets[i]);

}

for(int i=1;i<=sheetCount;i++)

{

int startRow = (i - 1) * rows; //记录起始行索引

int endRow = i * rows; //记录结束行索引

//若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数

if(i == sheetCount)

endRow = rowCount;

//获取要写入数据的WorkSheet对象,并重命名

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Name = sheetPrefixName + "-" + i.ToString();

//将dt中的数据写入WorkSheet

// for(int j=0;j

// {

// for(int k=0;k

// {

// workSheet.Cells[top + j,left + k] = dt.Rows[startRow + j][k].ToString();

// }

// }

//利用二维数组批量写入

int row = endRow-startRow;

string[,] ss = new string[row,colCount];

for(int j=0;j

{

for(int k=0;k

{

ss[j,k] = dt.Rows[startRow + j][k].ToString();

}

}

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(row,colCount);

range.Value = ss;

//合并相同行

this.MergeRows(workSheet,left+mergeColumnIndex,top,rows);

}

}

///

/// 将二维数组数据写入Excel文件(自动分页)

///

/// 二维数组

/// 每个WorkSheet写入多少行数据

/// 行索引

/// 列索引

public void ArrayToExcel(string[,] arr,int rows,int top,int left)

{

int rowCount = arr.GetLength(0); //二维数组行数(一维长度)

int colCount = arr.GetLength(1); //二维数据列数(二维长度)

sheetCount = this.GetSheetCount(rowCount,rows); //WorkSheet个数

//复制sheetCount-1个WorkSheet对象

for(int i=1;i

{

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Copy(missing,workBook.Worksheets[i]);

}

//将二维数组数据写入Excel

for(int i=sheetCount;i>=1;i--)

{

int startRow = (i - 1) * rows; //记录起始行索引

int endRow = i * rows; //记录结束行索引

//若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数

if(i == sheetCount)

endRow = rowCount;

//获取要写入数据的WorkSheet对象,并重命名

workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);

workSheet.Name = sheetPrefixName + "-" + i.ToString();

//将二维数组中的数据写入WorkSheet

// for(int j=0;j

// {

// for(int k=0;k

// {

// workSheet.Cells[top + j,left + k] = arr[startRow + j,k];

// }

// }

//利用二维数组批量写入

int row = endRow-startRow;

string[,] ss = new string[row,colCount];

for(int j=0;j

{

for(int k=0;k

{

ss[j,k] = arr[startRow + j,k];

}

}

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(row,colCount);

range.Value = ss;

}

}//end ArrayToExcel

///

/// 将二维数组数据写入Excel文件(不分页)

///

/// 二维数组

/// 行索引

/// 列索引

public void ArrayToExcel(string[,] arr,int top,int left)

{

int rowCount = arr.GetLength(0); //二维数组行数(一维长度)

int colCount = arr.GetLength(1); //二维数据列数(二维长度)

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(rowCount,colCount);

range.FormulaArray = arr;

}//end ArrayToExcel

///

/// 将二维数组数据写入Excel文件(不分页)

///

/// 二维数组

/// 行索引

/// 列索引

/// 填充的数据是否需要计算

public void ArrayToExcel(string[,] arr,int top,int left,bool isFormula)

{

int rowCount = arr.GetLength(0); //二维数组行数(一维长度)

int colCount = arr.GetLength(1); //二维数据列数(二维长度)

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(rowCount,colCount);

//注意:使用range.FormulaArray写合并的单元格会出问题

if(isFormula)

range.FormulaArray = arr;

else

range.Value = arr;

}//end ArrayToExcel

///

/// 将二维数组数据写入Excel文件(不分页),合并指定列的相同行

///

/// 二维数组

/// 行索引

/// 列索引

/// 填充的数据是否需要计算

/// 需要合并行的列索引

public void ArrayToExcel(string[,] arr,int top,int left,bool isFormula,int mergeColumnIndex)

{

int rowCount = arr.GetLength(0); //二维数组行数(一维长度)

int colCount = arr.GetLength(1); //二维数据列数(二维长度)

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(rowCount,colCount);

//注意:使用range.FormulaArray写合并的单元格会出问题

if(isFormula)

range.FormulaArray = arr;

else

range.Value = arr;

this.MergeRows(workSheet,mergeColumnIndex,top,rowCount);

}//end ArrayToExcel

///

/// 将二维数组数据写入Excel文件(不分页)

///

/// 工作表索引

/// 二维数组

/// 行索引

/// 列索引

public void ArrayToExcel(int sheetIndex,string[,] arr,int top,int left)

{

if(sheetIndex > this.WorkSheetCount)

{

this.KillExcelProcess();

throw new Exception("索引超出范围,WorkSheet索引不能大于WorkSheet数量!");

}

// 改变当前工作表

this.workSheet = (Excel.Worksheet)this.workBook.Sheets.get_Item(sheetIndex);

int rowCount = arr.GetLength(0); //二维数组行数(一维长度)

int colCount = arr.GetLength(1); //二维数据列数(二维长度)

range = (Excel.Range)workSheet.Cells[top,left];

range = range.get_Resize(rowCount,colCount);

range.Value2 = arr;

}//end ArrayToExcel

///

/// 将二维数组数据写入Excel文件(自动分页,并指定要合并的列索引)

///

/// 二维数组

/// 每个WorkSheet写入多少行数据

/// 行索引

/// 列索引

/// 数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值