开源分享
最近一个客户要做一个将数据直接输出到指定格式的Excel模板中,略施小计,搞定

其中包含了对Excel的增行和删行,打印预览,表头,表体,表尾的控制

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Windows.Forms; namespace UFIDA.U8.UAP.QW.Common
{
/// <summary>
/// Excel操作管理
/// </summary>
public class ExcelHandler
{ #region 按模板导出
/// <summary>
/// 导出至模板
/// </summary>
/// <param name="type">类型{市场费:0,代理费:1}</param>
/// <param name="dt">数据源</param>
/// <returns>失败信息errorMsg</returns>
public string ExportModel(int type, DataTable dt)
{
//选择保存路径
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() != DialogResult.OK)
return "";
string errorMsg = string.Empty;
string fileName = type == ? "代理费打印模板" : "市场费打印模板";
string path = Path.GetFullPath(@"Temp\" + fileName + ".xlsx");
string savaPath = fbd.SelectedPath;
savaPath=savaPath.EndsWith("\\")?savaPath:savaPath+"\\";
savaPath += fileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
//需要添加 Microsoft.Office.Interop.Excel引用
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
try
{
app.Visible = false;
app.UserControl = true;
Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(path); //加载模板
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)
{
errorMsg = "工作薄中没有工作表";
return errorMsg;
}
int rowIndex = ;
//写入数据,Excel索引从1开始。
//foreach (DataRow row in dt.Rows)
//{
if (rowIndex ==)
{
#region head
worksheet.Cells[, ] = "客户编码1";//row["产品名称"].ToStr();
worksheet.Cells[, ] = "客户名称1";//row["产品名称"].ToStr(); #endregion #region bottom #endregion
} #region body
worksheet.Cells[rowIndex, ] = "产品名称1";//row["产品名称"].ToStr();
worksheet.Cells[rowIndex, ] = "规格型号1";//row["规格型号"].ToStr();
worksheet.Cells[rowIndex, ] = 1001.0000;//row["结算数量"].ToStr().ToDouble();
worksheet.Cells[rowIndex, ] = 1002.0000;//row["销售单价"].ToStr().ToDouble();
worksheet.Cells[rowIndex, ] = 1003.0000;//row["销售金额"].ToStr().ToDouble();
worksheet.Cells[rowIndex, ] = 1004.0000;//row["结算单价"].ToStr().ToDouble();
worksheet.Cells[rowIndex, ] = 1005.0000;//row["差价"].ToStr().ToDouble();
worksheet.Cells[rowIndex, ] = 1006.0000;//row["应付费用"].ToStr().ToDouble();
#endregion rowIndex++;
InsertRows(worksheet, rowIndex); //} //调整Excel的样式。
//Microsoft.Office.Interop.Excel.Range rg = worksheet.Cells.get_Range("A3", worksheet.Cells[dt.Rows.Count + 2, 8]);
//rg.Borders.LineStyle = 1; //单元格加边框。
worksheet.Columns.AutoFit(); //自动调整列宽。
//Missing 在System.Reflection命名空间下。
workbook.SaveAs(savaPath, 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);
//workbook.PrintPreview(true);//打印预览,前提是app.Visible = true,否则看不到;
}
catch (Exception ex)
{
errorMsg += ex.Message;
}
finally
{
//最后一定要退出
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
}
return errorMsg;
}
/// <summary>
/// 在工作表中插入行,并调整其他行以留出空间
/// </summary>
/// <param name="sheet">工作簿</param>
/// <param name="rowIndex">行索引</param>
private void InsertRows(Microsoft.Office.Interop.Excel._Worksheet sheet, int rowIndex)
{
Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)sheet.Rows[rowIndex, missing];
//object Range.Insert(object shift, object copyorigin);
//shift: Variant类型,可选。指定单元格的调整方式。可以为下列 XlInsertShiftDirection 常量之一:
//xlShiftToRight 或 xlShiftDown。如果省略该参数,Microsoft Excel 将根据区域形状确定调整方式。
range.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, missing);
} /// <summary>
/// 在工作表中删除行
/// </summary>
/// <param name="sheet">工作簿</param>
/// <param name="rowIndex">行索引</param>
private void DeleteRows(Microsoft.Office.Interop.Excel.Worksheet sheet, int rowIndex)
{
Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)sheet.Rows[rowIndex, missing];
range.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp);
} #endregion
}
}

C#导出数据至excel模板的更多相关文章

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

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

  2. c# 导出数据到Excel模板

    最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式, eg: Last Name 姓 First Name 名 Chinese Characters汉字书写(仅大陆人填写) ...

  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. Spring 常用工具类

    1) 请求工具类 org.springframework.web.bind.ServletRequestUtils //取请求参数的整数值: public static Integer getIntP ...

  2. OSGI(面向Java的动态模型系统)

    基本简介编辑 OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方.OSGi联 O ...

  3. 启动Tomcat的时候遇到错误

    严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException at java. ...

  4. AutoCAD 2007在win8.1安装出现——错误1606。无法访问网络位置Autodesk\AutoCAD2007\R17.0\chs\的解决

    环境win 8.1 64位,AutoCAD 2007 安装CAD2007,一开始安装就出错,提示:错误1606.无法访问网络位置Autodesk\AutoCAD2007\R17.0\chs\ 百度之后 ...

  5. UVA 1108 - Mining Your Own Business

    刘汝佳书上都给出了完整的代码 在这里理一下思路: 由题意知肯定存在一个或者多个双连通分量: 假设某一个双连通分量有割顶.那太平井一定不能打在割顶上. 而是选择割顶之外的随意一个点: 假设没有割顶,则要 ...

  6. C++之类型转换

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 实现将A类的对象转换为B类对象的方法有3种:(A类对象<-------B类对象)    方法一:如果A为基类,B为派生类,能够将派生类的对象转 ...

  7. 【M17】考虑使用缓式评估

    1.缓式评估其实就是拖延战术,直到逼不得已的时候才去计算.缓式评估的使用场景有: 2.引用计数,考虑String,String是一个内含char指针(char指针以'\0'结束)的资源管理类,正常情况 ...

  8. 约瑟夫圆环的C++实现

    转载请注明出处:点我 昨天参加了企鹅的2015年实习生招聘的笔试,编程题第一道题就是约瑟夫圆环问题,要求用C++来实现. 约瑟夫圆环问题其实是一个很有名的问题:问题的描述为: 设有编号为1,2,……, ...

  9. php-工厂模式(转)

    针对自己的不足与加深php的认识,选择用php来研究各种设计模式. 今天就看了设计模式的介绍,并学习了工厂模式,因为工厂模式比较简单,也比较常用.工厂模式的最主要作用就是对象创建的封装.简化创建对象操 ...

  10. POJ 3126 Prime Path (BFS)

    [题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...