ASP.NET打印EXCEl报表技术总结
序言:我们在做企业项目或者一些管理系统的时候往往会用到导出到excel报表这项功能,下面我介绍的是用windows自带的excel来打印
首先必须引入:Interop.Excel.dll、Interop.Microsoft.Office.Core.dll这两个分别是microsoft对应excel的驱动
如何加如:在bin文件夹---右键添加引用
选择对应的office版本加入上面两个dll;
打印:
在后台打印操作如下:
假设得到了数据集DataSet ds=new DataSet();
- #region copy template to target dir
- string sourceFile = "";
- sourceFile = templateFilePath + @"\excel.xls";
- string targetFile = Server.MapPath(".") + @"\template\" + System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls";
- try
- {
- System.IO.File.Copy(sourceFile, targetFile);
- }
- catch { }
- #endregion
这一行代码是将模板复制到新的文件夹并按时间来命名,牵扯到文件操作,需要引用system.io
- Excel.Application xApp = null;//创建excel应用程序
- Excel.Workbook xBook = null;//工作簿
- Excel.Worksheet xSheet = null;//工作簿中创建工作表
- bool PrintNote = false;
- try
- {
- xApp = new Excel.ApplicationClass();
- xBook = xApp.Workbooks.Open(targetFile,
- Type.Missing, Type.Missing, Type.Missing, Type.Missing
- , Type.Missing, Type.Missing, Type.Missing, Type.Missing
- , Type.Missing, Type.Missing, Type.Missing, Type.Missing);
- xSheet = (Excel.Worksheet)xBook.Sheets[1];//有三个工作簿选择第一个,也可选择其他
- int startrow = 5;//从第几行开始打印
- int col = 0;
- int i = 0;
for (i = 0; i < ds.Tables[0].Rows.Count; i++)
{
col = startrow + i;//数据行
//下面就要对xsheet填入数据了
有两种方式:方式一
xSheet.get_Range("A" + col , Type.Missing).Value2 = ds.Tables[0].Rows[i]["NAME"].ToString().Trim();
xSheet.get_Range("A" + col , Type.Missing).Value2 = ds.Tables[0].Rows[i]["sex"].ToString().Trim();
xSheet.get_Range("A" + col , Type.Missing).Value2 = ds.Tables[0].Rows[i]["age"].ToString().Trim();
方式二:参数为行、列
xSheet.cells[col,1]=ds.Tables[0].Rows[i]["NAME"].ToString().Trim();
xSheet.cells[col,1]=ds.Tables[0].Rows[i]["NAME"].ToString().Trim();
xSheet.cells[col,1]=ds.Tables[0].Rows[i]["NAME"].ToString().Trim();
}
数据打印完成后加边框或其他操作
xSheet.get_Range("A" + (3).ToString(), "K" + (col).ToString()).Borders.LineStyle = 1;//加边框
xSheet.get_Range("A" + (3).ToString(), "A" + (col).ToString()).ShrinkToFit = true;//内容适应文本框大小
xBook.Save();//用于保存xSheet的数据
在需要合并单元格时序特别注意,必须要在没有填入数据前进行和并,否则会提示:覆盖前内容等提示;
合并方法 xSheet.get_Range("A" + (j + 3).ToString(), "A" + (j + 4).ToString()).MergeCells = true;
xSheet.get_Range(xSheet.cells[col,1], xSheet.cells[col,1]).MergeCells = true;
在操作完excel之后一定要记得关闭应用不然下次操作会提示excel占用。操作方法:
- if (xSheet != null)
- {
- System.Runtime.InteropServices.Marshal.ReleaseComObject(xSheet);
- xSheet = null;
- }
- if (xBook != null)
- {
- try
- {
- xBook.Close(false, System.Type.Missing, System.Type.Missing);
- }
- catch { }
- System.Runtime.InteropServices.Marshal.ReleaseComObject(xBook);
- xBook = null;
- }
- if (xApp != null)
- {
- System.Runtime.InteropServices.Marshal.ReleaseComObject(xApp);
- xApp = null;
- }
- GC.Collect();//强制代码垃圾回收
- DownLoadFile(targetFile, IYear.ToString() + ".xls");//下载文档
- return true;
下载文档的方法:
- protected void DownloadFile(string filename, string downname)
- {
- FileStream f = new FileStream(filename, FileMode.Open);
- byte[] buffer = new byte[f.Length];
- f.Read(buffer, 0, buffer.Length);
- f.Close();
- filename = filename.Replace(@"/", @"\");
- string saveFileName = "";
- int intStart = filename.LastIndexOf("\\") + 1;
- saveFileName = filename.Substring(intStart, filename.Length - intStart);
- Response.Clear();
- Response.Buffer = true;
- Response.Charset = "GB2312";
- try
- {
- if (filename.ToLower().IndexOf("doc") >= 0)
- {
- Response.ContentType = "application/ms-word";
- }
- else
- {
- if (filename.ToLower().IndexOf("xls") >= 0)
- {
- Response.ContentType = "application/ms-excel";
- }
- else
- {
- Response.ContentType = "application/octet-stream";
- }
- }
- }
- catch
- {
- Response.ContentType = "application/octet-stream";
- }
- Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(downname));
- Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
- Response.BinaryWrite(buffer);
- Response.GetHashCode();
- Response.End();
- }
文章打印成功
三:读取excel'中的数据到dataTable中
- #region
- public DataTable ReadExcelFile(string Filename, string SheetName, int _startIndex)
- {
- DataTable dt = null;
- OleDbConnection Con = null;
- if (Filename.ToLower().IndexOf(".xlsx") >= 0)
- {
- Con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Filename + ";Persist Security Info=False;Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1'");
- }
- else
- {
- Con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Filename + ";Persist Security Info=False;Extended Properties='Excel 8.0;HDR=NO;IMEX=1'");
- }
- Con.Open();
- OleDbCommand Cmd = new OleDbCommand("Select * From [" + SheetName + "$]", Con);
- OleDbDataReader Reader = Cmd.ExecuteReader();
- dt = GetDataTableFromDataReader(Reader, _startIndex);
- Con.Close();
- return dt;
- }
- /// <summary>
- /// Return a DataTable From OleDbDataReader
/// </summary>- /// <param name="reader">OleDbDataReader</param>
- /// <param name="_startIndex">起始行</param>
- /// <returns></returns>
- private DataTable GetDataTableFromDataReader(OleDbDataReader reader, int _startIndex)
- {
- DataTable schema = reader.GetSchemaTable();
- DataColumn[] columns = new DataColumn[schema.Rows.Count];
- DataColumn column;
- //Build the schema
- for (int i = 0; i < schema.Rows.Count; i++)
- {
- column = new DataColumn(); column.AllowDBNull = (bool)schema.Rows[i]["AllowDBNull"];
- column.AutoIncrement = (bool)schema.Rows[i]["IsAutoIncrement"];
- column.ColumnName = (string)schema.Rows[i]["ColumnName"];
- column.DataType = Type.GetType(schema.Rows[i]["DataType"].ToString());
- if (column.DataType == Type.GetType("System.String"))
- { column.MaxLength = (int)schema.Rows[i]["ColumnSize"]; }
- column.ReadOnly = (bool)schema.Rows[i]["IsReadOnly"];
- column.Unique = (bool)schema.Rows[i]["IsUnique"];
- columns[i] = column;
- }
- DataTable data = new DataTable();
- data.Columns.AddRange(columns);
- //Get the data itself.
- int j = 0;
- while (reader.Read())
- {
- if (j >= _startIndex)
- {
- if (j == _startIndex)
- {
- for (int i = 0; i < schema.Rows.Count; i++)
- {
- try
- {
- data.Columns[i].ColumnName = reader[i].ToString();
- }
- catch
- {
- data.Columns[i].ColumnName = " ";
- }
- }
- }
- else
- {
- DataRow row = data.NewRow();
- for (int i = 0; i < schema.Rows.Count; i++)
- { row[i] = reader[i]; }
- data.Rows.Add(row);
- }
- }
- j = j + 1;
- }
- return data;
- }
- #endregion
- }
ASP.NET打印EXCEl报表技术总结的更多相关文章
- 10、借助POI实现Java生成并打印excel报表(1)
10.1.了解 Apache POI 实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍.生成报表格式一般是EXCEL或者PDF .利用Apache PO ...
- POI打印Excel报表
1.将POI组件中的jar包放入项目中路径下的WEB-INF/lib目录中 2.在javabean中创建一个poi的java文件,中间出了创建getXXX(),setXXX()方法外,加入readRe ...
- 11、借助POI实现Java生成并打印excel报表(2)
11.POI打印功能 11.1.常用模块形式: HSSFPrintSetup printSetup = sheet.getPrintSetup(); printSetup.setVResolution ...
- ASP.NET MVC 4.0 中使用NPOI 2.2.0 按模板生成Excel报表
使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/ ...
- 在.NET中使用EPPlus生成Excel报表 .
--摘抄自:http://blog.csdn.net/zhoufoxcn/article/details/14112473 在开发.NET应用中可能会遇到需要生成带图表(Chart)的Excel报表的 ...
- Excel 报表导入导出
使用 Excel 进行报表的导入导出,首先下载相关的 jar 和 excel util. Excel Util 下载地址 引入依赖: <!-- poi office --> <dep ...
- Java中导入导出Excel -- POI技术
一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...
- Asp.net导出Excel续章(自定义合并单元格,非Office组件)
结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...
- asp.net 操作Excel大全
asp.net 操作Excel大全 转:http://www.cnblogs.com/zhangchenliang/archive/2011/07/21/2112430.html 我们在做excel资 ...
随机推荐
- sqlplus常用操作命令(转)
SQL*PLUS 是Oracle提供的一个工具程序,它不仅可以用于测试,运行SQL语句和PL/SQL块,而且还可以用于管理Oracle数据库 1.启动sql*plus 为了使用sql*plus,必须 ...
- What should we do when meet a crash in android?
制造一个crash 为了演示的目的,我在libsensors的open_sensors_device中故意制造了一个crash: static int open_sensors_device( ...
- js 写日期
<SCRIPT language="JavaScript" type="text/JavaScript"> today = new Date() ...
- .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直接调用该控件的成员. 控件绑定到特定的线程这个概念如下: 为了从另一个线程更新主线程的Window ...
- 第二章实例:ArrayAdapter结合ListView列表视图
package mydefault.packge; import com.example.codeview.R; import android.app.Activity; import android ...
- PHP学习笔记七【函数】
<?php $a=13; function abc3($a) { unset($a);//[释放给定变量]表示不在abc3函数范围内,不在使用$a,后面需要全新定义 $a=45; } abc(3 ...
- hibernate报错:org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
解决方法:自定义一个Hibernate Dialect. package com.yourcompany.util ; import java.sql.Types; import org.hibern ...
- Java转换
1.如何将字符串String转化为整数int int i = Integer.parseInt(str); int i = Integer.valueOf(my_str).intValue(); ...
- activity的生命周期详解
刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机 为了更清楚的看清楚工作的具体过程,举例如下: ,建立两个activity,一个main,一个a ...
- mysql+php+pdo批量添加大数据
1.使用insert into插入 ini_set('max_execution_time','0');//限制超时时间,因为第一种时间较长,索性设为0不限制 $pdo = new PDO(" ...