您的位置:首页 > 移动开发 > Objective-C

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;

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息