最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式,

eg:

Last Name 姓 First Name 名

Chinese Characters
汉字书写(仅大陆人填写)

     

实现方式有两种:

一、使用Microsoft.Office.Interop.Excel组件的方式

二、使用NPOI的方式

下面讲一下这两种方式的具体实现:

一、使用Microsoft.Office.Interop.Excel组件的方式

该方式需要引入Microsoft.Office.Interop.Excel;System.Reflection

实现代码:

 /// <summary>
/// 生成附件(使用Microsoft.Office.Interop.Excel组件的方式)
/// </summary>
/// <param name="DT"></param>
/// <returns></returns>
public static void GenerateAttachment(DataTable DT)
{
try
{
//需要添加 Microsoft.Office.Interop.Excel引用
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
if (app == null)//服务器上缺少Excel组件,需要安装Office软件
{
return;
}
app.Visible = false;
app.UserControl = true;
string strTempPath = Application.StartupPath + "\\EmailTemplate\\TE Enrollment Form.xls";
Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(strTempPath); //加载模板
Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Sheets;
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(); //第一个工作薄。
if (worksheet == null)//工作薄中没有工作表
{
return;
} //1、获取数据
int rowCount = DT.Rows.Count;
if (rowCount < )//没有取到数据
{
return;
} //2、写入数据,Excel索引从1开始
for (int i = ; i <= rowCount; i++)
{
int row_ = + i; //Excel模板上表头占了1行
int dt_row = i - ; //dataTable的行是从0开始的
worksheet.Cells[row_, ] = DT.Rows[dt_row]["Lastname_EN"].ToString();
worksheet.Cells[row_, ] = DT.Rows[dt_row]["Firstname_EN"].ToString();
worksheet.Cells[row_, ] = DT.Rows[dt_row]["namechinese"].ToString();
}
//调整Excel的样式。
Microsoft.Office.Interop.Excel.Range rg = worksheet.Cells.get_Range("A3", worksheet.Cells[rowCount + , ]);
rg.Borders.LineStyle = ; //单元格加边框
worksheet.Columns.AutoFit(); //自动调整列宽 //隐藏某一行
//选中部分单元格,把选中的单元格所在的行的Hidden属性设为true
//worksheet.get_Range(app.Cells[2, 1], app.Cells[2, 32]).EntireRow.Hidden = true; //删除某一行
worksheet.get_Range(app.Cells[, ], app.Cells[, ]).EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDirection.xlUp); //3、保存生成的Excel文件
//Missing在System.Reflection命名空间下
string savePath = Application.StartupPath + "\\Temp\\TEEnrollmentForm\\TE Enrollment Form.xls";
workbook.SaveAs(savePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //4、按顺序释放资源
NAR(worksheet);
NAR(sheets);
NAR(workbook);
NAR(workbooks);
app.Quit();
NAR(app);
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
}
/// <summary>
/// 释放资源
/// </summary>
/// <param name="o"></param>
public static void NAR(object o)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
finally
{
o = null;
}
}

二、使用NPOI的方式

该方式需要引用NPOI.dll

实现代码:

 /// <summary>
/// ExportExcel(使用NPOI的方式)
/// </summary>
/// <param name="DT"></param>
public static void ExportExcel(DataTable DT)
{
try
{
HSSFWorkbook hssfworkbookDown;
string modelExlPath = Application.StartupPath + "\\EmailTemplate\\TE Enrollment Form.xls";
if (File.Exists(modelExlPath) == false)//模板不存在
{
return;
}
using (FileStream file = new FileStream(modelExlPath, FileMode.Open, FileAccess.Read))
{
hssfworkbookDown = new HSSFWorkbook(file);
file.Close();
}
if (DT.Rows.Count > )
{
WriterExcel(hssfworkbookDown, , DT); string filename = "TE Enrollment Form.xls";
string strFilePath = Application.StartupPath + "\\Temp\\TEEnrollmentForm";
if (Directory.Exists(strFilePath) == false)
{
Directory.CreateDirectory(strFilePath);
}
strFilePath = strFilePath + "\\" + filename;
FileStream files = new FileStream(strFilePath, FileMode.Create);
hssfworkbookDown.Write(files);
files.Close();
if (File.Exists(strFilePath) == false)//附件生成失败
{
return;
}
}
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
}
/// <summary>
/// WriterExcel
/// </summary>
/// <param name="hssfworkbookDown"></param>
/// <param name="sheetIndex"></param>
/// <param name="DT"></param>
public static void WriterExcel(HSSFWorkbook hssfworkbookDown, int sheetIndex, DataTable DT)
{
try
{
#region 设置单元格样式
//字体
HSSFFont fontS9 = (HSSFFont)hssfworkbookDown.CreateFont();
fontS9.FontName = "Arial";
fontS9.FontHeightInPoints = ;
fontS9.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.NORMAL;
//表格
ICellStyle TableS9 = (ICellStyle)hssfworkbookDown.CreateCellStyle();
TableS9.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
TableS9.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
TableS9.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
TableS9.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
TableS9.WrapText = true;
TableS9.SetFont(fontS9);
#endregion HSSFSheet sheet = (HSSFSheet)hssfworkbookDown.GetSheetAt(sheetIndex);
hssfworkbookDown.SetSheetHidden(sheetIndex, false);
hssfworkbookDown.SetActiveSheet(sheetIndex); int n = ;//因为模板有表头,所以从第2行开始写
for (int j = ; j < DT.Rows.Count; j++)
{
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(j + n);
string strDepID = DT.Rows[j]["relationship"].ToString().Trim();
dataRow.CreateCell();
dataRow.Cells[].SetCellValue(strDepID == "" ? DT.Rows[j]["Lastname_EN"].ToString() : "");
dataRow.CreateCell();
dataRow.Cells[].SetCellValue(strDepID == "" ? DT.Rows[j]["Firstname_EN"].ToString() : "");
dataRow.CreateCell();
dataRow.Cells[].SetCellValue(strDepID == "" ? DT.Rows[j]["namechinese"].ToString() : ""); for (int i = ; i <= ; i++)//循环列,添加样式
{
dataRow.Cells[i].CellStyle = TableS9;
}
}
//设定第一行,第一列的单元格选中
sheet.SetActiveCell(, );
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
}

最终效果展示:

c# 导出数据到Excel模板的更多相关文章

  1. 一个很好的用C#导出数据到Excel模板的方法

    /// <summary> /// 导数据到Excel模板 /// </summary> /// <param name="tab">要输出内容 ...

  2. C#导出数据至excel模板

    开源分享最近一个客户要做一个将数据直接输出到指定格式的Excel模板中,略施小计,搞定 其中包含了对Excel的增行和删行,打印预览,表头,表体,表尾的控制 using System; using S ...

  3. C# 导出数据到Excel模板中(转)

    今天做报表的时候遇到了多表头的问题,而且相应的报表的格式都一样.所以就采用了报表模板的方式来进行. 第一步:在开发的当前项目中引入:Microsoft.Office.Interop.Excel:Sys ...

  4. C#导出数据的EXCEL模板设计

    一:将如下图中,查询出来的数据导出到EXCEL中 二:Excel的状态 三:设计的背后工作 四:最后一步,隐藏

  5. (原创)将Datatable数据按照Excel模板格式导出

    最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...

  6. 使用Open xml 操作Excel系列之二--从data table导出数据到Excel

    由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...

  7. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  8. 手把手教你springboot中导出数据到excel中

    手把手教你springboot中导出数据到excel中 问题来源: 前一段时间公司的项目有个导出数据的需求,要求能够实现全部导出也可以多选批量导出(虽然不是我负责的,我自己研究了研究),我们的项目是x ...

  9. 1.ASP.NET MVC使用EPPlus,导出数据到Excel中

    好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...

随机推荐

  1. PHP memory_get_usage()管理内存

    PHP memory_get_usage()管理内存 我们在实际编码中,要想实现对内存的查看和操作,许多程序员们第一个想到的就是PHP memory_get_usage()这个PHP脚本内存函数. 下 ...

  2. MySQL索引原理及慢查询优化(转)

    add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...

  3. c#的dllimport使用方法详解,调试找不到dll的方法

    DllImport会按照顺序自动去寻找的地方: 1.exe所在目录 2.System32目录 3.环境变量目录所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了 或者可以这样serve ...

  4. 无线路由!RTS DTIM阈值、Beacon 周期如何设置多少可以加快路由

    无线路由!RTS DTIM阈值.Beacon 周期如何设置多少可以加快路由 DTIM阈值是使用无线路由器时无线发送数据包的频率.1间隔最低,255最高[1]  但是想要使连接的设备达到最高运行速度,调 ...

  5. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  6. 定制自己的linux系统

    算是总结式文档,以备后忘 先说一下背景,一开始我就知道有这个任务,同时我自己也非常感兴趣,打算去研究研究 于是才同意接这个任务,但是我的原意是从头开始搭建系统,也就是lfs 但接到任务后,由于种种原因 ...

  7. Java编写最大公约数和最小公倍数

    package javaapplication24; class NegativeIntegerException extends Exception{ String message; public ...

  8. ubuntu源码安装node7+

    在官网上下载了node的tar.xz文件(node7.3.0),安装分为两步:1.解压  2.安装 解压也分成两步,首先用xz -d xxx.tar.xz解压为xxx.tar,然后用tar -xvf ...

  9. spark streaming 对接kafka记录

    spark streaming 对接kafka 有两种方式: 参考: http://group.jobbole.com/15559/ http://blog.csdn.net/kwu_ganymede ...

  10. A. Writing Code 完全背包

    http://codeforces.com/contest/543/problem/A 一开始这题用了多重背包做,结果有后效性. 就是如果6,这样拆分成 1 + 2 + 3的,那么能产生3的就有两种情 ...