POI学习笔记

简介: POI学习笔记

一、简介


二、快速入门

1、添加依赖

本着用新不用旧的原则,我们这里使用最新的5.X版本

<!--03 年的 .xls-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.2</version>
</dependency>
<!--07 年的 .xlsx-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.2</version>
</dependency>


2、快速入门

2.1 创建Workbook和Sheet

HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)
 HSSFSheet sheet = workbook.createSheet();//创建工作表(Sheet)
sheet = workbook.createSheet("Test");//创建工作表(Sheet)


2、创建单元格

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFRow row = sheet.createRow(0);// 创建行,从0开始
HSSFCell cell = row.createCell(0);// 创建行的单元格,也是从0开始
cell.setCellValue("李志伟");// 设置单元格内容
row.createCell(1).setCellValue(false);// 设置单元格内容,重载
row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载
row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载


3、合并单元格

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
//合并列
HSSFCell cell=row.createCell(0);
cell.setCellValue("合并列");
CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);
sheet.addMergedRegion(region);
//合并行
cell=row.createCell(6);
cell.setCellValue("合并行");
region=new CellRangeAddress(0, 5, 6, 6);
sheet.addMergedRegion(region);


4、单元格对齐相关参数

poi 是 5.2.2版本

/*  水平对齐相关参数:
        如果是左侧对齐就是 HSSFCellStyle.ALIGN_FILL;
        如果是居中对齐就是 HSSFCellStyle.ALIGN_CENTER;
        如果是右侧对齐就是 HSSFCellStyle.ALIGN_RIGHT;
        如果是跨列举中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;
        如果是两端对齐就是 HSSFCellStyle.ALIGN_JUSTIFY;
        如果是填充就是 HSSFCellStyle.ALIGN_FILL;
        垂直对齐相关参数:
        如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;
        如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;
        如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;
        如果是两端对齐就是 HSSFCellStyle.VERTICAL_JUSTIFY;*/
    HSSFCellStyle style=workbook.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    style.setWrapText(true);//自动换行
    style.setIndention((short)5);//缩进
    style.setRotation((short)60);//文本旋转,这里的取值是从-90到90,而不是0-180度。
    HSSFCell cell=row.createCell(0);
    cell.setCellValue("单元格对齐");
    cell.setCellStyle(style);


5、设置对齐格式和自动换行

poi 是 4.1.2版本

      //设置对齐格式
            CellStyle cellStyle = workBook.createCellStyle();
            //水平居中
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            //垂直居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
             //设置自动换行
            cellStyle.setWrapText(true);

6、设置字体格式

    /*   下划线选项值:
        单下划线 FontFormatting.U_SINGLE
        双下划线 FontFormatting.U_DOUBLE
        会计用单下划线 FontFormatting.U_SINGLE_ACCOUNTING
        会计用双下划线 FontFormatting.U_DOUBLE_ACCOUNTING
        无下划线 FontFormatting.U_NONE
        上标下标选项值:
        上标 FontFormatting.SS_SUPER
        下标 FontFormatting.SS_SUB
        普通,默认值 FontFormatting.SS_NONE*/
HSSFCell cell = row.createCell(1);
cell.setCellValue("设置字体");
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setFontName("华文行楷");//设置字体名称
font.setFontHeightInPoints((short)28);//设置字号
font.setColor(HSSFColor.RED.index);//设置字体颜色
font.setUnderline(FontFormatting.U_SINGLE);//设置下划线
font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标
font.setStrikeout(true);//设置删除线
style.setFont(font);
cell.setCellStyle(style);


三、poi的基本操作

1、poi设置自适应列宽

    //poi设置自适应列宽
    private void setColumnWidth(HSSFSheet sheet) {
        //sheet的索引从0开始,获取sheet列数
        int maxColumn = sheet.getRow(0).getPhysicalNumberOfCells();
        /**第一种,实现自动换行,但不适用于中文
         for (int i = 0; i < maxColumn; i++) {
         sheet.autoSizeColumn(i);
         }
         */
        //第二种
        for (int columnNum = 0; columnNum <= maxColumn; columnNum++) {
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            // 遍历列的数据,获取这一列的最长字符串
            for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
                HSSFRow currentRow;
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }
                if (currentRow.getCell(columnNum) != null) {
                    HSSFCell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        //int length = currentCell.getStringCellValue().getBytes().length;
                        //上面是网上所有currentCell获取length答案,但试过后发现偏大,在一个文章下的评论区看到下面的计算,试了一下,列宽实现了自适应大小,还没搞懂原因
                        //length = (byte长度+string长度)/2,有了解的麻烦,麻烦留言解释一下,感谢!!
                        int length = (currentCell.getStringCellValue().getBytes(StandardCharsets.UTF_8).length + currentCell.toString().length()) / 2;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            //将最长的length*256设为列宽
            // sheet.setColumnWidth((short)列数,(short)(length*256));
            sheet.setColumnWidth(columnNum, columnWidth * 256);
        }
    }
相关文章
|
2月前
|
easyexcel Java API
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
448 0
|
5月前
|
Java
使用POI导出Excel
使用POI导出Excel
|
Java API Apache
Apache POI 读写 Excel 教程
Apache POI 读写 Excel 教程
285 0
|
XML 存储 前端开发
POI报表的入门1
POI报表的入门
104 0
|
定位技术 数据安全/隐私保护
POI点获取
POI点POI是“Point of Information”的缩写,中文可以翻译为“信息点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等
218 0
|
存储 缓存 easyexcel
POI EasyExcel
EasyExcel 是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。 EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
POI EasyExcel
|
Java API Apache
|
easyexcel Java Apache
Apache POI和EasyExcel介绍
Apache POI和EasyExcel介绍
2291 0
Apache POI和EasyExcel介绍
|
程序员 计算机视觉
一次简单的poi导出Excel实践
一次简单的poi导出Excel实践
|
JSON 缓存 easyexcel