POI读写Excel的小小心得

今天想要和记录一下poi的小心得,反正记是不可能记住的,永远不可能记住的。但是一篇文章想写完感觉也有点困难,篇幅太长

一、对表进行锁定保护,用在需要上传固定的表格,但是经常有野蛮之人修改原表格然后上传的情况

先有WorkBook,创建sheet并先创建行然后创建列,设置行和列样式,而锁定表格通过protectSheet("password")来设置保护,当需要放开某个表格的时候,就覆盖其默认样式并将样式的setLocked(false)属性设置为false。


       //创建Excel表格
       HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("YourSheetName");

        sheet.setDefaultRowHeightInPoints(25);
        /**设置默认的宽度,需要指定某列的时候宽
         * 使用sheet.setColumnWidth(0,12)
         *
         */
        sheet.setDefaultColumnWidth(20);
        //整个表格锁定,开放只需要开放的单元格
        sheet.protectSheet("password");
        //创建你需要的行数,可以使用for循环来创建同一的行数 5行5列
        HSSFRow firstRow = sheet.createRow(0);
        for (int i = 0; i < 5 ; i++) {
            HSSFRow row = sheet.createRow(i);
            for (int j = 0; j < 5; j++) {
                HSSFCell cell = row.createCell(j);
                HSSFCellStyle cellStyle = workbook.createCellStyle();
                cellStyle.setBorderRight(BorderStyle.THIN);
                cell.setCellStyle(cellStyle);
                cell.setCellValue(j);
            }

        }
        //放开第5行第3列可编辑
        HSSFRow rowForFour = sheet.getRow(4);
        HSSFCell cellForThird = rowForFour.getCell(2);



        HSSFFont font = workbook.createFont();
        font.setFontName("微软雅黑");
        font.setFontHeightInPoints((short) 12);
        font.setColor(IndexedColors.BLACK.getIndex());

        HSSFCellStyle unlockStyle = workbook.createCellStyle();
        unlockStyle.setAlignment(HorizontalAlignment.CENTER);
        unlockStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //自动换行
        unlockStyle.setWrapText(true);
        //设置字体
        unlockStyle.setFont(font);
        //设置单元格放开
        unlockStyle.setLocked(false);
        cellForThird.setCellStyle(unlockStyle);
        //将创建的Excel表格输出 创建文件
        File excelFile = new File("D:/Excel","yourFileName.xls");
        //创建目录
        excelFile.getParentFile().mkdirs();

        try (FileOutputStream fileOutStream = new FileOutputStream(excelFile)) {
            workbook.write(fileOutStream);
            IOUtils.closeQuietly(fileOutStream);
        }

而里面设置你需要放开的单元格,将其设置为false即可。 unlockStyle.setLocked(false);

对于已经保护的表,要修改里面的内容的话就需要先将其复制一份,在复制的时候对表进行解除保护。

二、对于表格的合并

对于单元格的合并,我的理解是合并的区域是单独的对象,需要在合并的地方填上值的话,就要创建合并区域对应的单元格来对其进行赋值.

HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheetOne = workbook.createSheet("sheetOne");

        //合并区域 合并第一,二行 第一列
        sheetOne.addMergedRegion(new CellRangeAddress(0,1,0,0));

        //创建第二个单元格,并且赋值
        HSSFRow oneRow = sheetOne.createRow(0);
        //HSSFCell oneCell = oneRow.createCell(0);
        HSSFCell twocell = oneRow.createCell(1);
        //oneCell.setCellValue("1:1被合并的单元格赋值");
        twocell.setCellValue("1:2");

        HSSFRow twoRow = sheetOne.createRow(1);
        HSSFCell twoRowCell = twoRow.createCell(2);
        twoRowCell.setCellValue("2:3");

        //合并第5,6,7行第三行
        HSSFRow fiveRow = sheetOne.createRow(4);
        HSSFCell fiveRowCell = fiveRow.createCell(2);
        HSSFCell t53Cell = fiveRow.createCell(2);
        HSSFCell t51Cell = fiveRow.createCell(0);
        t51Cell.setCellValue("第五行第一列");
        fiveRowCell.setCellValue("合并第5,6,7行第3列");
        sheetOne.addMergedRegion(new CellRangeAddress(4,6,2,2));
        HSSFRow sixRow  = sheetOne.createRow(5);
        HSSFCell sixRowCell = sixRow.createCell(0);
        sixRowCell.setCellValue("第六行第一列");
        HSSFRow  sevenRow= sheetOne.createRow(6);
        HSSFCell sevenCell = sevenRow.createCell(0);
        sevenCell.setCellValue("第七行第一列");


        try {
            FileOutputStream fo = new FileOutputStream("D:/test03.xls");
            workbook.write(fo);

        } catch (Exception e) {
            e.printStackTrace();
        }


设置为合并的单元格设置边框:

 //给合并单元格设置边框值
            int numberOfRows = singleSheet.getPhysicalNumberOfRows();
            logger.info("合并单元格的");
            int lastNum = singleSheet.getPhysicalNumberOfRows() 
            CellRangeAddress address = new CellRangeAddress(numberOfRows, lastNum, 1, 1);
            singleSheet.addMergedRegion(quitDepNameAddress);
            RegionUtil.setBorderLeft(BorderStyle.THIN,address,singleSheet);
            RegionUtil.setBorderRight(BorderStyle.THIN,address,singleSheet);
            RegionUtil.setBorderTop(BorderStyle.THIN,address,singleSheet);
            RegionUtil.setBorderBottom(BorderStyle.THIN,address,singleSheet);

对于表格样式,要明白产生的先后顺序,不然的话,就容易被后面的样式覆盖。

三、隐藏表格线

对于隐藏表格线一种方式是通过对单元格设置它的style来指定


HSSFCellStyle style = workbook.createCellStyle();
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setStyle(style)

另一种需要整个表格去除表格线是通过对sheet对象设置其属性Gridlines.

            sheet.setDisplayGridlines(false);
            sheet.setPrintGridlines(false);

四、给你的表格添加批注

         //(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)  
        //前四个参数是坐标点,后四个参数是编辑和显示批注时的大小
        HSSFClientAnchor anchor = new HSSFClientAnchor(1, 2, 3, 4,
                (short) 1, 1, (short) 3, 1);
       
        HSSFComment comment = (HSSFComment)         cell.getSheet().createDrawingPatriarch().createCellComment(anchor);
        //设置批注内容
        comment.setString(new HSSFRichTextString(commentValue));
        //将批注添加到单元格对象中
        cell.setCellComment(comment);


需要注意的是:
1.一张sheet表,只能创建一个绘画对象HSSFPatriarch,这里是通过单元格反着获取到sheet再创建的
如果一张表创建多个绘画对象HSSFPatriarch,在添加批注时,会出现错误,会导致只有最后一行添加了批注 
2. HSSFWorkbook 这种创建的工作表,只能对第一张工作表操作 
3.在输出过程中,不能添加一次输出一次,必须要等到对最后一行数据校验完毕后才能输出,否则会覆盖点之前的批注或者只能在第一个上添加批注 

附上学习通道:https://www.cnblogs.com/XZHR/p/5634609.html

                       https://www.cnblogs.com/xdcr/p/6564963.html

猜你喜欢

转载自blog.csdn.net/LCF_lxf_ldy/article/details/82848138