编程语言
首页 > 编程语言> > java导出复杂打印格式的Excel

java导出复杂打印格式的Excel

作者:互联网

要做成:
在这里插入图片描述
打印区域为:
!](https://www.icode9.com/i/ll/?i=f125251795f44954a9b272ea770f2376.png?,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2hpcGxhc2hlcl90,size_20,color_FFFFFF,t_70,g_se,x_16)

划分的小单元是一盒的数据,也就是8行为一个单元来填入数据,这个看你具体的业务。更常见的是以一行为单位。

使用工具:某大佬的插件,稍微改动了一下打印部分的设置
ExcelTemplate插件代码https://gitee.com/jiangyongbing24/poi/blob/master/src/export/ExcelTemplate.java
博客原文
https://blog.csdn.net/jiangyongbing008/article/details/100795250
下载下来建一个工具类就行了

excel 模板
2-11行是我要循环的单元,代码中是用下标所以是1-10
在这里插入图片描述

测试代码:

  public static void hahah(){
        File file;
        FileOutputStream fop = null;
        try {
            ExcelTemplate excel = new ExcelTemplate("D:\\excel3.xlsx");
            if(!excel.examine())
                return;
            LinkedHashMap<Integer, LinkedList<String>> rows = new LinkedHashMap<>();
            // 创建第一个行区域里面填充的值,ExcelTemplate会按从左至右,
            // 从上往下的顺序,挨个填充区域里面的${},所以创建的时候注意顺序就好
            LinkedList<String> row1 = new LinkedList<>();

            // 把第一个行区域row1添加进入rows
            for(int i =1;i<=8;i++){
                row1.add(i+"");
                row1.add("当好档号");
                row1.add("文号文号");
                row1.add("责任者责任者");
                row1.add("题名题名题名");
                row1.add("20190910");
                row1.add("页数");
                row1.add("全宗号");
                row1.add("代码");
                row1.add("年度");
                if(i==8){
                    row1.add("第 209 盒");
                }
            }
            rows.put(1,row1);
            rows.put(2,row1);
            rows.put(3,row1);
            rows.put(4,row1); //设置放进去4个单元,就是4盒的数据
            // 第一个参数,需要操作的sheet的索引
	        // 第二个参数,需要复制的区域的第一行索引
	        // 第三个参数,需要复制的区域的最后一行索引
	        // 第四个参数,需要插入的位置的索引
	        // 第五个参数,填充行区域中${}的值
	        // 第六个参数,是否需要删除原来的区域
	        // 需要注意的是,行的索引一般要减一
            excel.addRowByExist(0,1,10,1,rows,true);
//          Workbook workbook = excel.getWorkbook();
            file = new File("D:/newfile.xlsx");
            excel.save(file.getPath());//他封装了保存的接口,不需要自己处理了
//            fop = new FileOutputStream(file);
//            byte[] contentInBytes = excel.getBytes();
//            fop.write(contentInBytes);
//            fop.flush();
//            fop.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (fop != null) {
                    fop.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

打印区域

打印的时候要设置边距,以及“归档文件目录”需要在打印的每页都显示,但是实际报表上只显示一次,如果手动操作的话是在“页面布局”,“”打印标题“”下设置,填入 $1:$1 ,第一行第一列作为打印标题
在这里插入图片描述

在这里插入图片描述

稍微改动代码,在ExcelTemplate.java中,initsheet方法里面,加入对打印的设置
发现这个单位有问题,我设置1,那么被设置为了2.5,所以单位尺就除以了2.5

        {//
            sheet.setRepeatingRows(new CellRangeAddress(0,0,0,0));
            //设置每页都有的打印标题,对应图中的$1:$1
            sheet.setMargin(HSSFSheet.BottomMargin,((double)6/(double)25));// 页边距(下)
            sheet.setMargin(HSSFSheet.TopMargin,( double ) 19/(double) 25 );// 页边距(左)
            sheet.setMargin(HSSFSheet.RightMargin,( double ) 1/(double) 2.5 );// 页边距(右)
            sheet.setMargin(HSSFSheet.LeftMargin,( double ) 1 /(double) 2.5);// 页边距(上)
            sheet.getPrintSetup().setLandscape(true); //纸张方向水平
            sheet.getPrintSetup().setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置A4
        }

标签:row1,rows,java,double,Excel,add,fop,导出,sheet
来源: https://blog.csdn.net/qq_37053589/article/details/120924724