Excel模板导出(针对复杂报表的一种解决方式)

比如需导出如下形式的报表:

里面数据字段分类很多,又含公式统计等情况。

解决方案:利用NPOI组件,制作导出模板,对单元格精确控制,通过读取单元格里的模板字段,进行数据匹配替换;模板形式如下:

核心方法

    /// <summary>
        /// 根据Excel模板单元格内容,找出单元格,并设置单元格的值
        /// </summary>
        /// <param name="sheet">ExcelSheet</param>
        /// <param name="rowIndex">行索引</param>
        /// <param name="cellTemplateValue">模板内容</param>
        /// <param name="cellFillValue">单元格值</param>
        ///  <param name="conNextRow">是否承接下一行,即:填充下一行单元格模板内容</param>
        public static void SetCellValueByTemplateStr(HSSFSheet sheet, int rowIndex, string cellTemplateValue, object cellFillValue, bool conNextRow = true)
        {
            int cellStartIndex = sheet.GetRow(rowIndex).FirstCellNum;
            int cellEndIndex = sheet.GetRow(rowIndex).LastCellNum;
            bool find = false;
            for (int i = cellStartIndex; i < cellEndIndex; i++)
            {
                if (find)
                    break;
                else
                    if (i < (cellEndIndex - cellStartIndex) / 2)
                    {
                        #region 折半查找:前半段
                        for (int j = i; j < (cellEndIndex - cellStartIndex) / 2; j++)
                        {
                            if (find)
                                break;
                            else
                            {
                                HSSFCell cell = sheet.GetRow(rowIndex).GetCell(j);
                                if (cell != null)
                                {
                                    if (cell.CellType == 1)
                                    {
                                        string strCellValue = sheet.GetRow(rowIndex).GetCell(j).StringCellValue;
                                        if (string.Compare(strCellValue, cellTemplateValue, true) == 0)
                                        {
                                            find = true;
                                            Type type = cellFillValue.GetType();
                                            switch (type.ToString())
                                            {
                                                case "System.String":
                                                    string strValue = cellFillValue.ToString();
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(strValue);
                                                    break;
                                                case "System.Int32":
                                                    int intValue = Convert.ToInt32(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(intValue);
                                                    break;
                                                case "System.Decimal":
                                                    double decimalValue = Convert.ToDouble(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(decimalValue);
                                                    break;
                                            }
                                            if (conNextRow)//如果承接下一行,则设置下一行单元格里的模板内容
                                            {
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellValue(cellTemplateValue);
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellType(1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        #region 折半查找:后半段
                        for (int j = (cellEndIndex - cellStartIndex) / 2; j < cellEndIndex; j++)
                        {
                            if (find)
                                break;
                            else
                            {
                                HSSFCell cell = sheet.GetRow(rowIndex).GetCell(j);
                                if (cell != null)
                                {
                                    if (cell.CellType == 1)
                                    {
                                        string strCellValue = sheet.GetRow(rowIndex).GetCell(j).StringCellValue;
                                        if (string.Compare(strCellValue, cellTemplateValue, true) == 0)
                                        {
                                            find = true;
                                            Type type = cellFillValue.GetType();
                                            switch (type.ToString())
                                            {
                                                case "System.String":
                                                    string strValue = cellFillValue.ToString();
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(strValue);
                                                    break;
                                                case "System.Int32":
                                                    int intValue = Convert.ToInt32(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(intValue);
                                                    break;
                                                case "System.Decimal":
                                                    double decimalValue = Convert.ToDouble(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(decimalValue);
                                                    break;
                                            }
                                            if (conNextRow)//如果承接下一行,则设置下一行单元格里的模板内容
                                            {
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellValue(cellTemplateValue);
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellType(1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        #endregion
                    }
            }
        }

Demo 下载

时间: 2024-10-29 01:35:16

Excel模板导出(针对复杂报表的一种解决方式)的相关文章

用poi,加载excel模板导出数据

上一篇博客是用jxl来生成类似模板文件的excel. 下面的代码,是根据模板excel,来导出带有数据的excel package com; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.po

java报表-基于excel模板的数据填充,即允许客户自定义编辑模板并生成报表

问题描述 基于excel模板的数据填充,即允许客户自定义编辑模板并生成报表 现有这样的开发需求,针对java语言的.目前有没有这样的技术,能允许客户对web页面上展示的多行多列数据进行随意筛选,并指定这些选中的数据在excel模板上的某列显示数据,是不是可行的?我在网上搜查了一下,有一个工具比较符合要求,但是资料太少,无法开发,这工具是ExcelUtils,它是基于模板生产报表,但是效果还是不理想,不满足需求,请问还有其他工具或技术可以实现吗?谢谢! 解决方案 Java体系下读写Excel的技术

报表中的Excel操作之Aspose.Cells(Excel模板)

      本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导出Excel的处理,如果你使用微软Excel的com组件,那么对于简单的操作还行,但是多余复杂的模板,那将是一个令人头疼的事.在Aspose.Cells之下,将是一个简单的事情.他可以导入导出excel操作,在本节将要说的就是他的际遇excel模板的导出强大功能.     多的不说,我们先来利用Northwind做两个小demo.先说说Aspose.Cells

asp.net使用npoi读取excel模板并导出下载详解

 这篇文章主要介绍了asp.net使用npoi读取excel模板并导出下载的示例,大家参考使用吧 为什么要使用NPOI导出Excel?   一.解决传统操作Excel遇到的问题:   如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机. Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123. 导出时,如果字段内容以"-"

poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

/** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @ClassName: CreateExcel * @Description: TODO() * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 * */ import java.io.File;import java.io.FileInput

poi3 8大数据导出-poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢

问题描述 poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢 poi3.8用((SXSSFSheet)sheet).flushRows()方法解决了大数据量的excel导出,但是我在使用过程中,由于每个单元格都要设置不同的颜色和数据格式,发现导出第一张报表时速度还勉强可以接受,但是继续导出另一张报表,速度就慢的跟蜗牛似的,要10分钟甚至3个小时,请问有什么方法可以解决? 代码如下: private static void fillExcel(KDTable kdtRepor

开发的报表“资产负债表”,直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的

问题描述 开发的报表"资产负债表",直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的 开发的报表"资产负债表",直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的

asp.net使用npoi读取excel模板并导出下载详解_实用技巧

为什么要使用NPOI导出Excel? 一.解决传统操作Excel遇到的问题: 如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机.Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123.导出时,如果字段内容以"-"或"="开头,Excel会把它当成公式进行,会报错.Excel会根据Excel文件前8行分

在使用OpenXml导出数据到Excel的时候如何设置报表单元格的宽度自适应

问题描述 在使用OpenXml导出数据到Excel的时候如何设置报表单元格的宽度自适应?拜托了 解决方案 解决方案二:兄弟啊,很急很关键.大家抬一手啊