DCOM技术自定义Excel模版报表组件的一些构思(适用于Excel 2003)
2009-07-13 17:19
435 查看
DCOM技术自定义Excel模版报表组件的一些构思(适用于Excel 2003)
Office无疑是目前最普及的办公软件,在应用开发过程中会有很多相关的需求,将其相关的功能进行组件化,已提高重用度,便于维护,是很有必要的;针对Excel2003的一些特性开发构件了一个轻量级的Excel报表组件:
报表组件主要功能(目前主要内存数据交换通过DataTable来处理,更通用的模式数据交换应用采用XML来完成):
1、将EXCEL数据文件导入系统中:
这一部分实现的比较简单循环Workbook.Sheet获取sheet.Name集合,后用使用OleDbDataAdapter将数据Fill进DataTable中,从目前的运行情况来看效率还是不错
的;
Web.config中配置OLEDB连接字符串如下:
<add key="ExcelOledbConnString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;"/> //0:为Excel文件的完整路径
查询字符串格式如下:
"select * from [{0}$]"; //0:为Excel的Sheet.Name
2、根据预先定义模版将数据导出到Excel中:
目前将数据大致分为(用户数据“单行单列如报表标题,创建者”、明细数据“多行多列数据,包括对图表数据列的标记”、多工作表数据,公式数据“如计算求和,平均
值等”、多工作表数据“数据量大时可能要分多个Sheet进行数据填充”...)
a、模版设计:根据数据类型定义命名区域,(使用模版好处:当应用系统发布后,用户要修改数据列顺序,修改数据列条件格式,修改图表数据区域等操作时,只需要修改更新Excel数据模版的标记和命名区域就可实现)如图:
b、核心思路:利用Excel Application全局Names,标记数据的分类及数据填充区域,利用Name.RefersToRange属性找到要填充数据的区域,根据“<>”内的标记解析填充的
数据字段进行数据填充,图表数据解析,公式计算,多工作表数据处理等分类操作导出后如图所示;
c、大数据量明细数据填充如采用一个单元格单元格处理效率较低(将数据解析为二维数据进行自动填充Range.Value2将大大提高效率)
/// <summary>
/// 根据模版标签 整合要填充的数据集信息方法
/// </summary>
/// <param name="srcDataTable">源数据表</param>
/// <param name="detailsRange">标签区域</param>
/// <returns>填充的二维数组</returns>
public object[,] MergerExcelData(System.Data.DataTable srcDataTable, Range detailsRange)
{
object[,] dataArray = new object[srcDataTable.Rows.Count, detailsRange.Cells.Count];
string [] columnList = new string[detailsRange.Cells.Count];
Range range = null;
string parm = string.Empty;
for (int i = 0; i < detailsRange.Cells.Count; i++)
{
range = (Range)detailsRange.Cells[0, i];
if (range.Value2 != null)
{
parm = range.Value2.ToString();
}
parm = ReportUtils.FillterString(parm);
if (parm.IndexOf(">.") > 0)
{
parm = parm.Substring(1, parm.IndexOf(">") - 1);
}
else if (parm.IndexOf(">") >= 2)
{
parm = parm.Substring(1, parm.Length - 2);
}
else
{
parm = string.Empty;
}
columnList[i] = parm ;
}
for (int i = 0; i < srcDataTable.Rows.Count; i++)
{
for (int j = 0; j < columnList.Count; j++)
{
dataArray[i, j] = ReportUtils.GetDataTableData(srcDataTable, i, columnList[j]);
}
}
return dataArray;
}
d、公式字段格式化进行公式填充
string forum = String.Format("={0}(R[{1}]C:R[-1]C)", parm, (templateCell.X1 - detalCell.X).ToString());
tempRange.FormulaR1C1 = (object)forum;
e:将行号转化成字符
/// <summary>
/// 将EXCEL的列号转换成字符
/// </summary>
/// <param name="anValue">行号</param>
/// <returns></returns>
public static string ConverNumToChar(int anValue)
{
int k, j, m;
string tmpStr;
k = 64;
m = anValue / 26;
j = anValue % 26;
if (0 == j)
{
m = m - 1;
}
if (m > 0)
{
tmpStr = "" + Convert.ToChar(k + m);
}
else
{
tmpStr = "";
}
if (j > 0)
{
tmpStr = tmpStr + Convert.ToChar(k + j);
}
else
{
tmpStr += "Z";
}
return tmpStr;
}
Office无疑是目前最普及的办公软件,在应用开发过程中会有很多相关的需求,将其相关的功能进行组件化,已提高重用度,便于维护,是很有必要的;针对Excel2003的一些特性开发构件了一个轻量级的Excel报表组件:
报表组件主要功能(目前主要内存数据交换通过DataTable来处理,更通用的模式数据交换应用采用XML来完成):
1、将EXCEL数据文件导入系统中:
这一部分实现的比较简单循环Workbook.Sheet获取sheet.Name集合,后用使用OleDbDataAdapter将数据Fill进DataTable中,从目前的运行情况来看效率还是不错
的;
Web.config中配置OLEDB连接字符串如下:
<add key="ExcelOledbConnString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;"/> //0:为Excel文件的完整路径
查询字符串格式如下:
"select * from [{0}$]"; //0:为Excel的Sheet.Name
2、根据预先定义模版将数据导出到Excel中:
目前将数据大致分为(用户数据“单行单列如报表标题,创建者”、明细数据“多行多列数据,包括对图表数据列的标记”、多工作表数据,公式数据“如计算求和,平均
值等”、多工作表数据“数据量大时可能要分多个Sheet进行数据填充”...)
a、模版设计:根据数据类型定义命名区域,(使用模版好处:当应用系统发布后,用户要修改数据列顺序,修改数据列条件格式,修改图表数据区域等操作时,只需要修改更新Excel数据模版的标记和命名区域就可实现)如图:
b、核心思路:利用Excel Application全局Names,标记数据的分类及数据填充区域,利用Name.RefersToRange属性找到要填充数据的区域,根据“<>”内的标记解析填充的
数据字段进行数据填充,图表数据解析,公式计算,多工作表数据处理等分类操作导出后如图所示;
c、大数据量明细数据填充如采用一个单元格单元格处理效率较低(将数据解析为二维数据进行自动填充Range.Value2将大大提高效率)
/// <summary>
/// 根据模版标签 整合要填充的数据集信息方法
/// </summary>
/// <param name="srcDataTable">源数据表</param>
/// <param name="detailsRange">标签区域</param>
/// <returns>填充的二维数组</returns>
public object[,] MergerExcelData(System.Data.DataTable srcDataTable, Range detailsRange)
{
object[,] dataArray = new object[srcDataTable.Rows.Count, detailsRange.Cells.Count];
string [] columnList = new string[detailsRange.Cells.Count];
Range range = null;
string parm = string.Empty;
for (int i = 0; i < detailsRange.Cells.Count; i++)
{
range = (Range)detailsRange.Cells[0, i];
if (range.Value2 != null)
{
parm = range.Value2.ToString();
}
parm = ReportUtils.FillterString(parm);
if (parm.IndexOf(">.") > 0)
{
parm = parm.Substring(1, parm.IndexOf(">") - 1);
}
else if (parm.IndexOf(">") >= 2)
{
parm = parm.Substring(1, parm.Length - 2);
}
else
{
parm = string.Empty;
}
columnList[i] = parm ;
}
for (int i = 0; i < srcDataTable.Rows.Count; i++)
{
for (int j = 0; j < columnList.Count; j++)
{
dataArray[i, j] = ReportUtils.GetDataTableData(srcDataTable, i, columnList[j]);
}
}
return dataArray;
}
d、公式字段格式化进行公式填充
string forum = String.Format("={0}(R[{1}]C:R[-1]C)", parm, (templateCell.X1 - detalCell.X).ToString());
tempRange.FormulaR1C1 = (object)forum;
e:将行号转化成字符
/// <summary>
/// 将EXCEL的列号转换成字符
/// </summary>
/// <param name="anValue">行号</param>
/// <returns></returns>
public static string ConverNumToChar(int anValue)
{
int k, j, m;
string tmpStr;
k = 64;
m = anValue / 26;
j = anValue % 26;
if (0 == j)
{
m = m - 1;
}
if (m > 0)
{
tmpStr = "" + Convert.ToChar(k + m);
}
else
{
tmpStr = "";
}
if (j > 0)
{
tmpStr = tmpStr + Convert.ToChar(k + j);
}
else
{
tmpStr += "Z";
}
return tmpStr;
}
相关文章推荐
- JasperReport+iReport报表中同一个excel中建立多个sheet页以及自定义命名sheet的名称
- web报表开发技术专题五:Excel的阴影
- java的poi技术读取Excel[2003-2007,2010]
- ApachePOI组件操作Excel,制作报表(四)
- java web利用poi组件导出excel让用户自定义导出地址
- 基于EXCEL的WEB报表输出组件
- java的poi技术读取Excel[2003-2007,2010]
- QTP的那些事--报表自定义(excel,html,xml或者是其他格式的)
- Excel单元格自定义格式的一些基础知识
- jfreechart,pdf生成组件iText,jasper report报表组件及POI操作excel等在企业软件开发中常遇到的第三方应用
- Apache POI组件操作Excel,制作报表(一)
- Apache POI组件操作Excel,制作报表(二) .
- Apache POI组件操作Excel,制作报表(二)
- Apache POI组件操作Excel,制作报表(一)
- 关于JSF2中自定义组件处理表单值的一些问题
- 关于ireport制作报表模版时的一些注意
- Excel 2003 中如何自定义 Number 格式
- 在DCOM 中不存在WORD、EXCEL等OFFICE组件
- 在DCOM中不存在WORD、EXCEL等OFFICE组件
- VS2010“.NET技术”自定义新建文件模版