最近做了个小项目,涉及到了数据导出到Excel文档,微软对Excel的接口操作基本全支持,主要通过阅读MSDN来完成的(可能有存在错误的地方,欢迎批评指正),现在汇总一下:
项目需要添加Microsoft.Office.Interop.Excel;
ApplicationClass--Excel应用程序、Workbook--工作簿、Worksheet--工作单、ChatObject--表格对象、Range--工作单中选中的范围
基本方法:整数转换成Excel列
private string IntToColumnName(int num)
{
string columnName = string.Empty;
if (num <= 26)
{
columnName = ((char)('A' + num - 1)).ToString();
}
else
{
columnName = ((char)('A' + ((num-1) / 26 - 1))).ToString() + ((char)('A' + (num + 25) % 26)).ToString();
}
return columnName;
}
/// <summary>
/// 添加工作表
/// </summary>
public void AddWorksheet()
{
if (worksheet != null)
{
this.workbook.Sheets.Add(paramMissing, worksheet, 1, XlSheetType.xlWorksheet);
}
else if (workbook != null)
{
this.workbook.Sheets.Add(paramMissing, paramMissing, 1, XlSheetType.xlWorksheet);
}
}
/// <summary>
/// 删除当前工作表
/// </summary>
public void DeleteWorksheet()
{
if (worksheet != null)
this.worksheet.Delete();
}
/// <summary>
/// 改变当前工作表
/// </summary>
/// <param name="sheetIndex">工作表编号</param>
public void ChangeCurrentWorksheet(int sheetIndex)
{
if (sheetIndex < 1)
return;
if (sheetIndex > workbook.Sheets.Count)
return;
this.worksheet = (Worksheet)this.workbook.Sheets.get_Item(sheetIndex);
}
/// <summary>
/// 改变工作表的名称
/// </summary>
/// <param name="sheetIndex">工作表编号</param>
/// <param name="sheetName">工作表名称</param>
public void ChangeWorksheetName(int sheetIndex, string sheetName)
{
if (sheetIndex < 1)
return;
if (sheetIndex > workbook.Sheets.Count)
return;
if (!string.IsNullOrEmpty(sheetName))
{
worksheet = (Worksheet)this.workbook.Sheets.get_Item(sheetIndex);
worksheet.Name = sheetName;
}
}
/// <summary>
/// 设置指定单元格的文本
/// </summary>
/// <param name="rowIndex">行</param>
/// <param name="columnIndex">列</param>
/// <param name="text">文本</param>
public void SetCell(int rowIndex, int columnIndex, string text)
{
try
{
worksheet.Cells[rowIndex, columnIndex] = text;
}
catch
{
//throw new Exception("向单元格[" + rowIndex + "," + columnIndex + "]写数据出错!");
}
}
数组arr赋值给worksheet表单
public Range ArrayToExcel(object[,] arr, int rowCount, int colCount, int top, int left)
{
string row = IntToColumnName(left) + top.ToString();
string col = IntToColumnName(left + colCount - 1) + ((int)(rowCount + top-1)).ToString();
Range range = null;
try
{
range = worksheet.get_Range(row, col);
range.Value2 = arr;
range.Borders.LineStyle = 1;
range.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
//range.EntireColumn.AutoFit();
}
catch { }
return range;
}
dataRange内的数据生成柱状图、折线图、饼状图到worksheet表单的指定位置
/// <summary>
/// 添加柱状图
/// </summary>
/// <param name="dataRange">数据范围</param>
/// <param name="left">左端位置</param>
/// <param name="top">顶端位置</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="plotBy">x轴,1代表rows,2代表columns</param>
/// <param name="chartTitle">图标题</param>
/// <param name="categoryTitle">类别(x轴)标题</param>
/// <param name="valueTitle">值(y轴)标题</param>
/// <param name="layout">布局类别(1-7)</param>
/// <returns></returns>
public bool AddColumnChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle, int layout)
{
try
{
chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
chartObj = chartObjects.Add(left, top, width, height);
chartObj.Chart.ChartWizard(dataRange, XlChartType.xlColumnClustered, paramChartFormat, plotBy, paramCategoryLabels, paramSeriesLabels, paramHasLegend, chartTitle, categoryTitle, valueTitle, paramMissing);
chartObj.Chart.ApplyLayout(layout, XlChartType.xlColumnClustered);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 添加折线图
/// </summary>
/// <param name="dataRange">数据范围</param>
/// <param name="left">左端位置</param>
/// <param name="top">顶端位置</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="plotBy">x轴,1代表rows,2代表columns</param>
/// <param name="chartTitle">图标题</param>
/// <param name="categoryTitle">类别(x轴)标题</param>
/// <param name="valueTitle">值(y轴)标题</param>
/// <param name="layout">布局类别(1-7)</param>
/// <returns></returns>
public bool AddLineChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle,int layout)
{
try
{
chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
chartObj = chartObjects.Add(left, top, width, height);
chartObj.Chart.ChartWizard(dataRange, XlChartType.xlLine, paramChartFormat, plotBy, paramCategoryLabels, paramSeriesLabels, paramHasLegend, chartTitle, categoryTitle, valueTitle, paramMissing);//plotby
chartObj.Chart.ApplyLayout(layout, XlChartType.xlLine);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 添加饼状图
/// </summary>
/// <param name="dataRange">数据范围</param>
/// <param name="left">左端位置</param>
/// <param name="top">顶端位置</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="chartTitle">图标题</param>
/// <param name="categoryTitle">类别(x轴)标题</param>
/// <param name="valueTitle">值(y轴)标题</param>
/// <param name="layout">布局类别(1-7)</param>
/// <returns></returns>
public bool AddPieChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle, int layout)
{
try
{
chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
chartObj = chartObjects.Add(left, top, width, height);
chartObj.Chart.ChartWizard(dataRange, XlChartType.xlPie, 0, plotBy, paramMissing, paramMissing, paramMissing, chartTitle, paramMissing, paramMissing, paramMissing);//plotby
chartObj.Chart.HasTitle = true;
chartObj.Chart.ApplyLayout(layout,XlChartType.xlPie);
return true;
}
catch
{
return false;
}
}