• Android修行手册-POI操作中文API文档


    👉关于作者

    专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
    有什么需要欢迎底部卡片私我,交流让学习不再孤单

    在这里插入图片描述

    👉实践过程

    😜一、 POI简介

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    😜二、 HSSF概况

    HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

    😜三、 POI EXCEL文档结构类

    HSSFWorkbook excel文档对象
    HSSFSheet excel的sheet HSSFRow excel的行
    HSSFCell excel的单元格 HSSFFont excel字体
    HSSFName 名称 HSSFDataFormat 日期格式
    HSSFHeader sheet头
    HSSFFooter sheet尾
    HSSFCellStyle cell样式
    HSSFDateUtil 日期
    HSSFPrintSetup 打印
    HSSFErrorConstants 错误信息表

    😜四、 EXCEL常用操作方法

    1、得到Excel常用对象

    POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));
    HSSFWorkbook wb = new HSSFWorkbook(fs);//得到Excel工作簿对象
    HSSFSheet sheet = wb.getSheetAt(0);//得到Excel工作表对象
    HSSFRow row = sheet.getRow(i);//得到Excel工作表的行
    HSSFCell cell = row.getCell((short) j);//得到Excel工作表指定行的单元格
    cellStyle = cell.getCellStyle();//得到单元格样式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、建立Excel常用对象

    //芝麻粒儿 https://zhima.blog.csdn.net/
    HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
    HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象
    HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行
    cellStyle = wb.createCellStyle();//创建单元格样式
    row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格
    row.createCell((short)0).setCellValue(1); //设置Excel工作表的值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、设置sheet名称和单元格内容

    wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);
    cell.setEncoding((short) 1);
    cell.setCellValue("单元格内容");
    
    • 1
    • 2
    • 3

    4、取得sheet的数目

    wb.getNumberOfSheets()
    
    • 1

    5、根据index取得sheet对象

    HSSFSheet sheet = wb.getSheetAt(0);
    
    • 1

    6、取得有效的行数

    int rowcount = sheet.getLastRowNum();
    
    • 1

    7、取得一行的有效单元格个数

    row.getLastCellNum();
    
    • 1

    8、单元格值类型读写

    cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型
    cell.getNumericCellValue();//读取为数值类型的单元格内容
    
    • 1
    • 2

    9、设置列宽、行高

    sheet.setColumnWidth((short)column,(short)width);
    row.setHeight((short)height);
    
    • 1
    • 2

    10、添加区域,合并单元格

    Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo
    ,(short)columnTo);//合并从第rowFrom行columnFrom列
    sheet.addMergedRegion(region);// 到rowTo行columnTo的区域
    //得到所有区域
    sheet.getNumMergedRegions()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    11、保存Excel文件

    FileOutputStream fileOut = new FileOutputStream(path);
    wb.write(fileOut);
    
    • 1
    • 2

    12、根据单元格不同属性返回字符串数值

    //芝麻粒儿 https://zhima.blog.csdn.net/
    public String getCellStringValue(HSSFCell cell) {
        String cellValue = "";
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING://字符串类型
            cellValue = cell.getStringCellValue();
            if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
                cellValue=" ";
            break;
        case HSSFCell.CELL_TYPE_NUMERIC: //数值类型
            cellValue = String.valueOf(cell.getNumericCellValue());
            break;
        case HSSFCell.CELL_TYPE_FORMULA: //公式
            cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
            cellValue = String.valueOf(cell.getNumericCellValue());
            break;
        case HSSFCell.CELL_TYPE_BLANK:
            cellValue=" ";
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            break;
        case HSSFCell.CELL_TYPE_ERROR:
            break;
        default:
            break;
        }
        return cellValue;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    13、常用单元格边框格式

    HSSFCellStyle style = wb.createCellStyle();
    style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框
    style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框
    style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    
    • 1
    • 2
    • 3
    • 4
    • 5

    14、设置字体和内容位置

    HSSFFont f  = wb.createFont();
    f.setFontHeightInPoints((short) 11);//字号
    f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗
    style.setFont(f);
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
    style.setRotation(short rotation);//单元格内容的旋转的角度
    HSSFDataFormat df = wb.createDataFormat();
    style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式
    cell.setCellFormula(string);//给单元格设公式
    style.setRotation(short rotation);//单元格内容的旋转的角度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    15、插入图片

    //芝麻粒儿 https://zhima.blog.csdn.net/
    //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
    ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
    BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));
    ImageIO.write(bufferImg,"jpg",byteArrayOut);
    FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); //读进一个excel模版
    fs = new POIFSFileSystem(fos);
    HSSFWorkbook wb = new HSSFWorkbook(fs); //创建一个工作薄
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);
    patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    16、调整工作表位置

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFPrintSetup ps = sheet.getPrintSetup();
    sheet.setAutobreaks(true);
    ps.setFitHeight((short)1);
    ps.setFitWidth((short)1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    17、设置打印区域

    HSSFSheet sheet = wb.createSheet("Sheet1");
    wb.setPrintArea(0, "$A$1:$C$2");
    
    • 1
    • 2

    18、标注脚注

    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFFooter footer = sheet.getFooter()
    footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
    
    • 1
    • 2
    • 3

    19、在工作单中清空行数据,调整行位置

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("row sheet");
    // Create various cells and rows for spreadsheet.
    // Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)
    sheet.shiftRows(5, 10, -5);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    20、选中指定的工作表

    HSSFSheet sheet = wb.createSheet("row sheet");
    heet.setSelected(true);
    
    • 1
    • 2

    21、工作表的放大缩小

    HSSFSheet sheet1 = wb.createSheet("new sheet");
    sheet1.setZoom(1,2);   // 50 percent magnification
    
    • 1
    • 2

    22、头注和脚注

    //芝麻粒儿 https://zhima.blog.csdn.net/
    HSSFSheet sheet = wb.createSheet("new sheet");
    HSSFHeader header = sheet.getHeader();
    header.setCenter("Center Header");
    header.setLeft("Left Header");
    header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +
    HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    23、自定义颜色

    HSSFCellStyle style = wb.createCellStyle(); // 创建一个HSSFCellStyle对象
    style.setFillForegroundColor(HSSFColor.LIME.index); // 设置填充颜色为青色
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 设置填充模式为实心填充
    HSSFFont font = wb.createFont(); // 创建一个HSSFFont对象
    font.setColor(HSSFColor.RED.index); // 设置字体颜色为红色
    style.setFont(font); // 将字体设置为创建的HSSFFont对象
    cell.setCellStyle(style); // 将单元格的样式设置为创建的HSSFCellStyle对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    24、填充和颜色设置

    // 创建一个HSSFCellStyle对象
    HSSFCellStyle style = wb.createCellStyle();
    style.setFillBackgroundColor(HSSFColor.AQUA.index); // 设置填充背景色为AQUA
    style.setFillPattern(HSSFCellStyle.BIG_SPOTS); // 设置填充图案为BIG_SPOTS
    HSSFCell cell = row.createCell((short) 1); // 创建一个HSSFCell对象,并设置其列索引为1
    cell.setCellValue("X"); // 设置cell的值为 "X"
    style = wb.createCellStyle(); // 创建另一个HSSFCellStyle对象
    style.setFillForegroundColor(HSSFColor.ORANGE.index); // 设置填充前景色为橙色
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 设置填充图案为SOLID_FOREGROUND
    cell.setCellStyle(style); // 将cell的样式设置为新的style
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    25、强行刷新单元格公式

    HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);
    /**
     * 更新指定行中的公式
     * 芝麻粒儿 https://zhima.blog.csdn.net/
     * @param wb 工作簿对象
     * @param s 工作表对象
     * @param row 行号
     */
    private static void updateFormula(Workbook wb, Sheet s, int row) {
        Row r = s.getRow(row);
        Cell c = null;
        FormulaEvaluator eval = null;
    
        // 判断工作簿类型并选择相应的 evaluator
        if (wb instanceof HSSFWorkbook) {
            eval = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
        } else if (wb instanceof XSSFWorkbook) {
            eval = new XSSFFormulaEvaluator((XSSFWorkbook) wb);
        }
    
        // 遍历行中的每个单元格
        for (int i = r.getFirstCellNum(); i < r.getLastCellNum(); i++) {
            // 获取当前单元格
            if (c == null) {
                c = r.getCell(i);
            }
    
            // 如果是公式类型的单元格,则进行计算
            if (c.getCellType() == Cell.CELL_TYPE_FORMULA) {
                eval.evaluateFormulaCell(c);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    说明:FormulaEvaluator提供了evaluateFormulaCell(Cell cell)方法,计算公式保存结果,但不改变公式。而evaluateInCell(Cell cell) 方法是计算公式,并将原公式替换为计算结果,也就是说该单元格的类型不在是Cell.CELL_TYPE_FORMULA而是Cell.CELL_TYPE_NUMBERIC。HSSFFormulaEvaluator提供了静态方法evaluateAllFormulaCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。

    😜POI 方法总结

    1.设置不显示excel网格线
    sheet.setDisplayGridlines(false);其中sheet是Sheet对象
    2.设置excel单元格中的内容换行
    cellStyle.setWrapText(true);其中cellStyle是WorkBook创建的CellStyle对象,然后将cellStyle设置到要换行的Cell对象,最后在要换行的对象(一般为字符串)加入"/r/n"。如
    topTile.append("/r/n" +"cellContent");
    
    3.单元格的合并
    sheet.addMergedRegion(new CellRangeAddress(0, 4, 0, 2));本示例为合并424.设置页眉和页脚的页数
    HSSFHeader header = sheet.getHeader();
    header.setCenter("Center Header");
    header.setLeft("Left Header");
    header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +
    HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");
    HSSFFooter footer = (HSSFFooter )sheet.getFooter()
    footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
    
    5.使得一个Sheet适合一页
    sheet.setAutobreaks(true);
    6.设置放大属性(Zoom被明确为一个分数,例如下面的75%使用3作为分子,4作为分母)
    sheet.setZoom(3,4);
    
    7.设置打印
    HSSFPrintSetup print = (HSSFPrintSetup) sheet.getPrintSetup();
    print.setLandscape(true);//设置横向打印   
    print.setScale((short) 70);//设置打印缩放70%   
    print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置为A4纸张   
    print.setLeftToRight(true);//設置打印顺序先行后列,默认为先列行              
    print.setFitHeight((short) 10);设置缩放调整为10页高
    print.setFitWidth((short) 10);设置缩放调整为宽高
    
    sheet.setAutobreaks(false);
    if (i != 0 && i % 30 == 0)
    sheet.setRowBreak(i);//設置每30行分頁打印
    
    8.反复的行和列(设置打印标题)
    HSSFWorkbook wb = new HSSFWorkbook();
    wb.setRepeatingRowsAndColumns(0, 0, 12, 1, 6);//设置1到12列,行1到6每一页重复打印
    
    9.调整单元格宽度
    sheet.setAutobreaks(true);
    sheet.setColumnWidth((short)i,colsWidth[i]); //设定单元格长度   
    sheet.autoSizeColumn((short) i);//自动根据长度调整单元格长度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    👉其他

    📢作者:小空和小芝中的小空
    📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
    📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

    温馨提示点击下方卡片获取更多意想不到的资源。
    空名先生

  • 相关阅读:
    C++入门篇1
    红黑树及其相关操作(一遍包会)
    vue element编辑功能
    秋招/考研复试-数据结构
    Android TextWatcher 避免死循环
    云计算基础知识
    Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)
    [附源码]SSM计算机毕业设计基于的花店后台管理系统JAVA
    linux实现开机自启动服务/脚本
    javaweb基于ssm的仓库管理系统
  • 原文地址:https://blog.csdn.net/qq_27489007/article/details/134373896