您的位置:首页 > 其它

OA项目之操作EXCEL导出数据报表的类

2013-09-03 09:40 267 查看
/// <summary>

/// 操作EXCEL导出数据报表的类

/// Copyright (C) Maticsoft

/// </summary>

public class DataToExcel

{

public DataToExcel()

{

}

#region 操作EXCEL的一个类(需要Excel.dll支持)

private int titleColorindex = 15;

/// <summary>

/// 标题背景色

/// </summary>

public int TitleColorIndex

{

set { titleColorindex = value; }

get { return titleColorindex; }

}

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

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

#region 创建一个Excel示例

/// <summary>

/// 创建一个Excel示例

/// </summary>

public void CreateExcel()

{

Excel.Application excel = new Excel.Application();

excel.Application.Workbooks.Add(true);

excel.Cells[1, 1] = "第1行第1列";

excel.Cells[1, 2] = "第1行第2列";

excel.Cells[2, 1] = "第2行第1列";

excel.Cells[2, 2] = "第2行第2列";

excel.Cells[3, 1] = "第3行第1列";

excel.Cells[3, 2] = "第3行第2列";

//保存

excel.ActiveWorkbook.SaveAs("./tt.xls", XlFileFormat.xlExcel9795, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);

//打开显示

excel.Visible = true;

// excel.Quit();

// excel=null;

// GC.Collect();//垃圾回收

}

#endregion

#region 将DataTable的数据导出显示为报表

/// <summary>

/// 将DataTable的数据导出显示为报表

/// </summary>

/// <param name="dt">要导出的数据</param>

/// <param name="strTitle">导出报表的标题</param>

/// <param name="FilePath">保存文件的路径</param>

/// <returns></returns>

public string OutputExcel(System.Data.DataTable dt, string strTitle, string FilePath)

{

beforeTime = DateTime.Now;

Excel.Application excel;

Excel._Workbook xBk;

Excel._Worksheet xSt;

int rowIndex = 4;

int colIndex = 1;

excel = new Excel.ApplicationClass();

xBk = excel.Workbooks.Add(true);

xSt = (Excel._Worksheet)xBk.ActiveSheet;

//取得列标题

foreach (DataColumn col in dt.Columns)

{

colIndex++;

excel.Cells[4, colIndex] = col.ColumnName;

//设置标题格式为居中对齐

xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[4, colIndex]).Font.Bold = true;

xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[4, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;

xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[4, colIndex]).Select();

xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[4, colIndex]).Interior.ColorIndex = titleColorindex;//19;//设置为浅黄色,共计有56种

}

//取得表格中的数据

foreach (DataRow row in dt.Rows)

{

rowIndex++;

colIndex = 1;

foreach (DataColumn col in dt.Columns)

{

colIndex++;

if (col.DataType == System.Type.GetType("System.DateTime"))

{

excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");

xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐

}

else

if (col.DataType == System.Type.GetType("System.String"))

{

excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString();

xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐

}

else

{

excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();

}

}

}

//加载一个合计行

int rowSum = rowIndex + 1;

int colSum = 2;

excel.Cells[rowSum, 2] = "合计";

xSt.get_Range(excel.Cells[rowSum, 2], excel.Cells[rowSum, 2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

//设置选中的部分的颜色

xSt.get_Range(excel.Cells[rowSum, colSum], excel.Cells[rowSum, colIndex]).Select();

//xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex =Assistant.GetConfigInt("ColorIndex");// 1;//设置为浅黄色,共计有56种

//取得整个报表的标题

excel.Cells[2, 2] = strTitle;

//设置整个报表的标题格式

xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, 2]).Font.Bold = true;

xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, 2]).Font.Size = 22;

//设置报表表格为最适应宽度

xSt.get_Range(excel.Cells[4, 2], excel.Cells[rowSum, colIndex]).Select();

xSt.get_Range(excel.Cells[4, 2], excel.Cells[rowSum, colIndex]).Columns.AutoFit();

//设置整个报表的标题为跨列居中

xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, colIndex]).Select();

xSt.get_Range(excel.Cells[2, 2], excel.Cells[2, colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;

//绘制边框

xSt.get_Range(excel.Cells[4, 2], excel.Cells[rowSum, colIndex]).Borders.LineStyle = 1;

xSt.get_Range(excel.Cells[4, 2], excel.Cells[rowSum, 2]).Borders[Excel.XlBordersIndex.xlEdgeLeft].Weight = Excel.XlBorderWeight.xlThick;//设置左边线加粗

xSt.get_Range(excel.Cells[4, 2], excel.Cells[4, colIndex]).Borders[Excel.XlBordersIndex.xlEdgeTop].Weight = Excel.XlBorderWeight.xlThick;//设置上边线加粗

xSt.get_Range(excel.Cells[4, colIndex], excel.Cells[rowSum, colIndex]).Borders[Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlThick;//设置右边线加粗

xSt.get_Range(excel.Cells[rowSum, 2], excel.Cells[rowSum, colIndex]).Borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = Excel.XlBorderWeight.xlThick;//设置下边线加粗

afterTime = DateTime.Now;

//显示效果

//excel.Visible=true;

//excel.Sheets[0] = "sss";

ClearFile(FilePath);

string filename = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".xls";

excel.ActiveWorkbook.SaveAs(FilePath + filename, Excel.XlFileFormat.xlExcel9795, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);

//wkbNew.SaveAs strBookName;

//excel.Save(strExcelFileName);

#region 结束Excel进程

//需要对Excel的DCOM对象进行配置:dcomcnfg

//excel.Quit();

//excel=null;

xBk.Close(null, null, null);

excel.Workbooks.Close();

excel.Quit();

//注意:这里用到的所有Excel对象都要执行这个操作,否则结束不了Excel进程

// if(rng != null)

// {

// System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);

// rng = null;

// }

// if(tb != null)

// {

// System.Runtime.InteropServices.Marshal.ReleaseComObject(tb);

// tb = null;

// }

if (xSt != null)

{

System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);

xSt = null;

}

if (xBk != null)

{

System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);

xBk = null;

}

if (excel != null)

{

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

excel = null;

}

GC.Collect();//垃圾回收

#endregion

return filename;

}

#endregion

#region Kill Excel进程

/// <summary>

/// 结束Excel进程

/// </summary>

public void KillExcelProcess()

{

Process[] myProcesses;

DateTime startTime;

myProcesses = Process.GetProcessesByName("Excel");

//得不到Excel进程ID,暂时只能判断进程启动时间

foreach (Process myProcess in myProcesses)

{

startTime = myProcess.StartTime;

if (startTime > beforeTime && startTime < afterTime)

{

myProcess.Kill();

}

}

}

#endregion

#endregion

#region 将DataTable的数据导出显示为报表(不使用Excel对象,使用COM.Excel)

#region 使用示例

/*使用示例:

* DataSet ds=(DataSet)Session["AdBrowseHitDayList"];

string ExcelFolder=Assistant.GetConfigString("ExcelFolder");

string FilePath=Server.MapPath(".")+"\\"+ExcelFolder+"\\";

//生成列的中文对应表

Hashtable nameList = new Hashtable();

nameList.Add("ADID", "广告编码");

nameList.Add("ADName", "广告名称");

nameList.Add("year", "年");

nameList.Add("month", "月");

nameList.Add("browsum", "显示数");

nameList.Add("hitsum", "点击数");

nameList.Add("BrowsinglIP", "独立IP显示");

nameList.Add("HitsinglIP", "独立IP点击");

//利用excel对象

DataToExcel dte=new DataToExcel();

string filename="";

try

{

if(ds.Tables[0].Rows.Count>0)

{

filename=dte.DataExcel(ds.Tables[0],"标题",FilePath,nameList);

}

}

catch

{

//dte.KillExcelProcess();

}

if(filename!="")

{

Response.Redirect(ExcelFolder+"\\"+filename,true);

}

*

* */

#endregion

/// <summary>

/// 将DataTable的数据导出显示为报表(不使用Excel对象)

/// </summary>

/// <param name="dt">数据DataTable</param>

/// <param name="strTitle">标题</param>

/// <param name="FilePath">生成文件的路径</param>

/// <param name="nameList"></param>

/// <returns></returns>

public string DataExcel(System.Data.DataTable dt, string strTitle, string FilePath, Hashtable nameList)

{

COM.Excel.cExcelFile excel = new COM.Excel.cExcelFile();

ClearFile(FilePath);

string filename = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".xls";

excel.CreateFile(FilePath + filename);

excel.PrintGridLines = false;

COM.Excel.cExcelFile.MarginTypes mt1 = COM.Excel.cExcelFile.MarginTypes.xlsTopMargin;

COM.Excel.cExcelFile.MarginTypes mt2 = COM.Excel.cExcelFile.MarginTypes.xlsLeftMargin;

COM.Excel.cExcelFile.MarginTypes mt3 = COM.Excel.cExcelFile.MarginTypes.xlsRightMargin;

COM.Excel.cExcelFile.MarginTypes mt4 = COM.Excel.cExcelFile.MarginTypes.xlsBottomMargin;

double height = 1.5;

excel.SetMargin(ref mt1, ref height);

excel.SetMargin(ref mt2, ref height);

excel.SetMargin(ref mt3, ref height);

excel.SetMargin(ref mt4, ref height);

COM.Excel.cExcelFile.FontFormatting ff = COM.Excel.cExcelFile.FontFormatting.xlsNoFormat;

string font = "宋体";

short fontsize = 9;

excel.SetFont(ref font, ref fontsize, ref ff);

byte b1 = 1,

b2 = 12;

short s3 = 12;

excel.SetColumnWidth(ref b1, ref b2, ref s3);

string header = "页眉";

string footer = "页脚";

excel.SetHeader(ref header);

excel.SetFooter(ref footer);

COM.Excel.cExcelFile.ValueTypes vt = COM.Excel.cExcelFile.ValueTypes.xlsText;

COM.Excel.cExcelFile.CellFont cf = COM.Excel.cExcelFile.CellFont.xlsFont0;

COM.Excel.cExcelFile.CellAlignment ca = COM.Excel.cExcelFile.CellAlignment.xlsCentreAlign;

COM.Excel.cExcelFile.CellHiddenLocked chl = COM.Excel.cExcelFile.CellHiddenLocked.xlsNormal;

// 报表标题

int cellformat = 1;

// int rowindex = 1,colindex = 3;

// object title = (object)strTitle;

// excel.WriteValue(ref vt, ref cf, ref ca, ref chl,ref rowindex,ref colindex,ref title,ref cellformat);

int rowIndex = 1;//起始行

int colIndex = 0;

//取得列标题

foreach (DataColumn colhead in dt.Columns)

{

colIndex++;

string name = colhead.ColumnName.Trim();

object namestr = (object)name;

IDictionaryEnumerator Enum = nameList.GetEnumerator();

while (Enum.MoveNext())

{

if (Enum.Key.ToString().Trim() == name)

{

namestr = Enum.Value;

}

}

excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref namestr, ref cellformat);

}

//取得表格中的数据

foreach (DataRow row in dt.Rows)

{

rowIndex++;

colIndex = 0;

foreach (DataColumn col in dt.Columns)

{

colIndex++;

if (col.DataType == System.Type.GetType("System.DateTime"))

{

object str = (object)(Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd"); ;

excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref str, ref cellformat);

}

else

{

object str = (object)row[col.ColumnName].ToString();

excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref str, ref cellformat);

}

}

}

int ret = excel.CloseFile();

// if(ret!=0)

// {

// //MessageBox.Show(this,"Error!");

// }

// else

// {

// //MessageBox.Show(this,"请打开文件c:\\test.xls!");

// }

return filename;

}

#endregion

#region 清理过时的Excel文件

private void ClearFile(string FilePath)

{

String[] Files = System.IO.Directory.GetFiles(FilePath);

if (Files.Length > 10)

{

for (int i = 0; i < 10; i++)

{

try

{

System.IO.File.Delete(Files[i]);

}

catch

{

}

}

}

}

#endregion

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐