DCOM技术自定义Excel模版报表组件的一些构思(适用于Excel 2003)

来源:互联网 发布:软件和信息服务业协会 编辑:程序博客网 时间:2024/05/17 02:28

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;
        }

原创粉丝点击