java如何实现报表管理用java实现多报表的同时预览

17:46 提问
ireport 如何实现多个detail
各位大神,ireport 如何实现多个detail,每一个的detail格式不一样。
按赞数排序
没有用过这个detail,搜索了一下也没有多少介绍。是xml解析的么?楼上的答案偏的太厉害了吧。
没用过ireport,但是看楼主的提问,估计很多人被吓跑了。。。推荐试试FineReport吧,一直在用,算是做报表的一款利器了。不谢哦,助人为乐!
其他相似问题当前位置: →
→ 请教mysql怎么实现向多个表同时插入数据
请教mysql怎么实现向多个表同时插入数据
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: 请问mysql如何实现向多个表同时插入数据?在一个jsp页面表单上的数据,submit后表单上不同的数据分别同时插入不同的表.具体表的...
"请教mysql怎么实现向多个表同时插入数据"::
请问如何实现向多个表同时插入数据?在一个jsp页面表单上的数据,submit后表单上不同的数据分别同时插入不同的表.具体表的情况是这样的的,三个表为:person表,operator表,contact表,三个表的主键为objectid,通过objectid关联.假如只设置了person表的objectid是自增字段,应该如何实现?假如objectid不是自增字段,应该如何设计数据表?------解决方案--------------------
建一个sequence表,在插入表之前先取得person表的objectid,然后分别插入各张表。也可以,还有可以将表的默认值关联到sequence上,这样插入的时候不需要插入这个字段,只要插入其他值就可以。
------解决方案--------------------
1、假如只设置了person表的objectid是自增字段,应该如何实现?& --------------------person表objectid是自增字段,那么可以先插入它,然后取出它。如果你使用了orm框架,那么它会自动帮此文来自: 马开东博客
转载请注明出处 网址:
你把key取出来帮设置好。如果没有用框架,那么用的sql指令select last_insert_id()是可以取到你刚刚插入的记录的key的。然后吧这个值附给其他2个记录。2、假如objectid不是自增字段,应该如何设计数据表?--建议不要这样做。非要这么做的话,可以:(1)做一个方法,在每次插入前,找到person表的最大的objectid,然后加1。这种办法需要考虑的是并发冲突导致抢号事件发生,所以要考虑采用同步。(2)做一个专门产生号码的空表,只定义一个自增字段,然后用这个表的key作为3个表的key。--其实跟前面的方法一样,只不过把person的自增字段移到了这个多余的表而已。(3)专门做一个流水号表,维持一行记录,每次把流水号加1。这种方式同样要考虑同步的问题。综上所述,还是1合适! 搜索此文相关文章:怎么实现向多个表同时插入数据此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
请教mysql怎么实现向多个表同时插入数据_JavaWeb相关文章
JavaWeb_总排行榜
JavaWeb_最新
JavaWeb_月排行榜
JavaWeb_周排行榜
JavaWeb_日排行榜Java根据模板导出Excel报表并复制模板生成多个Sheet页
作者:巴黎的雨季
字体:[ ] 类型:转载 时间:
本文主要介绍了Java根据模板导出Excel报表并复制模板生成多个Sheet页的方法,具有很好的参考价值。下面跟着小编一起来看下吧
因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为& 根据提供的模板来导出Excel报表
并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求,
使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样
那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可)
采用的技术为 POI 导出,因为类的缘故,目前只支持2003版本的Excel.
使用前请先下载相应jar包!
后期有时间的话会进行进一步完善,初次写工具类,若有不完善的地方还请包涵!
先看看模板样式和运行结果,然后直接上代码
这是Excel的模板样式
这是导出结果
具体实现看demo
package com.sgcc.xyz.
import java.io.F
import java.io.FileInputS
import java.io.OutputS
import java.util.L
import java.util.M
import javax.servlet.http.HttpServletR
import org.apache.poi.hssf.usermodel.HSSFC
import org.apache.poi.hssf.usermodel.HSSFCellS
import org.apache.poi.hssf.usermodel.HSSFR
import org.apache.poi.hssf.usermodel.HSSFS
import org.apache.poi.hssf.usermodel.HSSFW
import org.apache.poi.hssf.util.HSSFC
import org.apache.poi.hssf.util.R
import org.apache.poi.poifs.filesystem.POIFSFileS
import com.sgcc.uap.persistence.impl.HibernateDaoI
* 报表导出工具类
* @author JYLiu
@巴黎的雨季
本工具是根据POI对Excel2003进行报表导出 本工具类可根据模板进行Excel的导出
并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求
使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样
那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可)
public class ExcelUtil {
* 根据模板导出报表,可导出多个Sheet页
* @param 导出的Excel文件名
* @param 模板路径 (全路径)
* @param 数据源
* @param 返回请求
* @param 生成的Sheet页的名称集合
* @param 数据源中Map集合的key值 (key值对应的value值顺序要列名顺序一致)
* @param 开始 循环写入数据 的行数(从第几行开始写入数据)
public static void ExcelByModel(String ExcelName, String ModelURl, List&Map&String, String&& dataSource,
HttpServletResponse response, String[] sheetNames, String[] keyNames, int rowNum) throws Exception {
// 设置导出Excel报表的导出形式
response.setContentType("application/vnd.ms-excel");
// 设置导出Excel报表的响应文件名
String fileName = new String(ExcelName.getBytes("utf-8"), "ISO-8859-1");
response.setHeader("Content-disposition", "filename=" + fileName + ".xls");
// 创建一个输出流
OutputStream fileOut = response.getOutputStream();
// 读取模板文件路径
File file = new File(ModelURl);
FileInputStream fins = new FileInputStream(file);
POIFSFileSystem fs = new POIFSFileSystem(fins);
// 读取Excel模板
HSSFWorkbook wb = new HSSFWorkbook(fs);
// 设置边框样式
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 设置边框样式的颜色
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setRightBorderColor(HSSFColor.BLACK.index);
style.setTopBorderColor(HSSFColor.BLACK.index);
HSSFSheet sheetModel =
// 新建的Sheet页
HSSFSheet newSheet =
HSSFRow row =
HSSFCell cell =
// 循环建立Sheet页
for (int i = 0; i & sheetNames. i++) {
// 读取模板中模板Sheet页中的内容
sheetModel = wb.getSheetAt(0);
// 设置新建Sheet的页名
newSheet = wb.createSheet(sheetNames[i]);
// 将模板中的内容复制到新建的Sheet页中
copySheet(wb, sheetModel, newSheet, sheetModel.getFirstRowNum(), sheetModel.getLastRowNum());
//获取到新建Sheet页中的第一行为其中的列赋值
row=newSheet.getRow(0);
row.getCell(1).setCellValue("这是为表代码赋的值");
//注意 合并的单元格也要按照合并前的格数来算
row.getCell(6).setCellValue("这是为外部代码赋的值");
//获取模板中的第二列,并赋值
row=newSheet.getRow(1);
row.getCell(1).setCellValue("表名称赋值");
//注意 合并的单元格也要按照合并前的格数来算
row.getCell(6).setCellValue("这是为是否系统表赋的值");
// 遍历数据源 开始写入数据(因为Excel中是从0开始,所以减一)
int num = rowNum - 1;
for (Map&String, String& item : dataSource) {
// 循环遍历,新建行
row = newSheet.createRow((short) num);
//判断有多少列数据
for (int j = 0; j & keyNames. j++) {
// 设置每列的数据
设置每列的样式
设置每列的值
cell = row.createCell(j); cell.setCellStyle(style); cell.setCellValue(item.get(keyNames[j]));
// break 加break可以测试只添加一个Sheet页的情况
wb.write(fileOut);
fileOut.close();
* @param Excel工作簿对象
* @param 模板Sheet页
* @param 新建Sheet页
* @param 模板页的第一行
* @param 模板页的最后一行
private static void copySheet(HSSFWorkbook wb, HSSFSheet fromsheet, HSSFSheet newSheet, int firstrow, int lasttrow) {
// 复制一个单元格样式到新建单元格
if ((firstrow == -1) || (lasttrow == -1) || lasttrow & firstrow) {
// 复制合并的单元格
Region region =
for (int i = 0; i & fromsheet.getNumMergedRegions(); i++) {
region = fromsheet.getMergedRegionAt(i);
if ((region.getRowFrom() &= firstrow) && (region.getRowTo() &= lasttrow)) {
newSheet.addMergedRegion(region);
HSSFRow fromRow =
HSSFRow newRow =
HSSFCell newCell =
HSSFCell fromCell =
// 设置列宽
for (int i = i & i++) {
fromRow = fromsheet.getRow(i);
if (fromRow != null) {
for (int j = fromRow.getLastCellNum(); j &= fromRow.getFirstCellNum(); j--) {
int colnum = fromsheet.getColumnWidth((short) j);
if (colnum & 100) {
newSheet.setColumnWidth((short) j, (short) colnum);
if (colnum == 0) {
newSheet.setColumnHidden((short) j, true);
newSheet.setColumnHidden((short) j, false);
// 复制行并填充数据
for (int i = 0; i & i++) {
fromRow = fromsheet.getRow(i);
if (fromRow == null) {
newRow = newSheet.createRow(i - firstrow);
newRow.setHeight(fromRow.getHeight());
for (int j = fromRow.getFirstCellNum(); j & fromRow.getPhysicalNumberOfCells(); j++) {
fromCell = fromRow.getCell((short) j);
if (fromCell == null) {
newCell = newRow.createCell((short) j);
newCell.setCellStyle(fromCell.getCellStyle());
int cType = fromCell.getCellType();
newCell.setCellType(cType);
switch (cType) {
case HSSFCell.CELL_TYPE_STRING:
newCell.setCellValue(fromCell.getRichStringCellValue());
case HSSFCell.CELL_TYPE_NUMERIC:
newCell.setCellValue(fromCell.getNumericCellValue());
case HSSFCell.CELL_TYPE_FORMULA:
newCell.setCellValue(fromCell.getCellFormula());
case HSSFCell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(fromCell.getBooleanCellValue());
case HSSFCell.CELL_TYPE_ERROR:
newCell.setCellValue(fromCell.getErrorCellValue());
newCell.setCellValue(fromCell.getRichStringCellValue());
以上便是整个工具类的核心代码了
测试数据如下
* 测试多Sheet页导出数据表格方法
public static void ExcelTest(HttpServletResponse response){
//构建数据源
List&Map&String, String&& dataSourceList=new ArrayList&Map&String,String&&(){
add(new HashMap&String, String&(){{
put("字段编号", "1");
put("字段代码", "BUSINESS_ID");
put("字段含义", "业务id");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", "是");
put("主码", "");
add(new HashMap&String, String&(){{
put("字段编号", "2");
put("字段代码", "PROC_INST_ID");
put("字段含义", "流程实例编号");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", "");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "3");
put("字段代码", "PROC_STATE");
put("字段含义", "流程状态");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "4");
put("字段代码", "APPLICANT");
put("字段含义", "申请人");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "5");
put("字段代码", "LEAVE_TYPE");
put("字段含义", "请假类型");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "6");
put("字段代码", "REASON");
put("字段含义", "请假事因");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "7");
put("字段代码", "BEGIN_TIME");
put("字段含义", "起始时间");
put("数据类型", "TIMESTAMP");
put("长度", "");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "8");
put("字段代码", "END_TIME");
put("字段含义", "结束时间");
put("数据类型", "TIMESTAMP");
put("长度", "");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "9");
put("字段代码", "INSERT_PERSON");
put("字段含义", "登记人");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
add(new HashMap&String, String&(){{
put("字段编号", "10");
put("字段代码", "APPROVEDBY");
put("字段含义", "批准人");
put("数据类型", "VARCHAR");
put("长度", "64");
put("主键", " ");
put("主码", " ");
//构建数据源中的key值
String[] keysStrings={"字段编号","字段代码","字段含义","数据类型","长度","主键","主码"};
//每页的名称
String [] sheetNameStrings={"Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6"};
String modelURLString="D:\\model\\model.xls";
ExcelUtil.ExcelByModel("测试模板导出", modelURLString, dataSourceList, response, sheetNameStrings, keysStrings, 6);
} catch (Exception e) {
e.printStackTrace();
以上就是关于Excel报表根据模板导出并生成多个Sheet也的小工具了,需要的可以参考代码,根据实际业务需求进行代码调整。
希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
最近需要做一个统计的模块。大概是这样一个表格,实际行列数和这个不同。一的值可能是111+112,二的值可能是211*221111的值可能是112+113,121的值可能是122*123112,113,122,123等最后两列的值都是从数据库中取得然后计算求值。
然后这个表格是有多种类型的,三四五列也有多种类型比如表格有一,二,三 三种类型。三四五列可能有20种类型。一类型包含列1到15,二包含5到10,三包含7到20
后台代码应该如何设计才能简洁,易拓展?
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App}

我要回帖

更多关于 java实现自动扩展报表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信