apache-poi

excel类型

excel分为03版本和07版本

  • 03版本 new HSSFWorkbook();
    优点:速度快
    缺点:只能写入65536行数据
    文件类型:.xls
  • 07版本 new XSSFWorkbook();
    优点:不限制写入数量
    缺点:容易造成内存溢出(OOM),速度慢
    文件类型:.xlsx
  • 07加速版 new SXSSFWorkbook();
    在写入过程中会产生临时文件,需要手动清除:((SXSSFWorkbook)wb).dispose();
    文件类型:.xlsx

依赖

xml 复制代码
<!--03-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.12</version>
</dependency>
<!--07-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.12</version>
</dependency>

写入

java 复制代码
private static void write(){
	// 创建一个工作簿
	Workbook wb = new HSSFWorkbook();
	// 创建一个工作表
	Sheet sheet = wb.createSheet("sheet页名称");
	// 创建一行
	Row row = sheet.createRow(0);
	// 创建一个单元格
	Cell cell = row.createCell(0);
	// 生成一张表
	FileOutputStream outputStream = new FileOutputStream(PATH + "demo.xls");
	wb.write(outputStream);
}

读取

java 复制代码
private static void read(){
	FileInputStream inputStream = new FileInputStream(PATH + "demo.xls");
	Workbook wb = new HSSFWorkbook(inputStream);
	Sheet sheet = wb.getSheetAt(0);
	Row row = sheet.getRow(0);
	Cell cell = row.getCell(0);
	// 获取sheet页总行数
	int rowCount = sheet.getPhysicalNumberOfRows();
	// 获取一行的列数
	int cellCount = row.getPhysicalNumberOfCells();
	// 获取单元格的数据类型
	int cellType = cell.getCellType();
	switch (cellType) {
	    case HSSFCell.CELL_TYPE_STRING:cell.getStringCellValue();break;// 读字符串
	    case HSSFCell.CELL_TYPE_BOOLEAN:cell.getBooleanCellValue();break;// 读布尔值
	    case HSSFCell.CELL_TYPE_FORMULA:cell.getCellFormula();break;// 读公式
	    case HSSFCell.CELL_TYPE_BLANK:break;
	    case HSSFCell.CELL_TYPE_ERROR:break;
	    case HSSFCell.CELL_TYPE_NUMERIC:
	        if (HSSFDateUtil.isCellDateFormatted(cell)) {
	            cell.getDateCellValue();// 读日期
	        } else {
	            // 为防止数字过长,将数字以字符串的格式输出
	            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
	            cell.getStringCellValue();
	        }
	        break;
	}
}

通用版-写入

java 复制代码
private void autoWrite(){
    FileOutputStream outputStream = null;
    try {
        创建工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        
        创建一种字体
        HSSFFont font = wb.createFont();
        // 粗体
        font.setBold(true);
        // 设置字号
        font.setFontHeightInPoints((short) 14);
        
        创建一种风格
        HSSFCellStyle style = wb.createCellStyle();
        // 设置边框:双线
        style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 上
        style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 下
        style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 左
        style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 右
        // 顶端对齐
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
        // 垂直居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 水平居中
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 设置字体
        style.setFont(font);
        // 设置背景颜色
        style.setFillBackgroundColor(HSSFColor.GREY_40_PERCENT.index);
        // 设置前景颜色:excel一般使用前景色
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        // 设置模式
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        // 设置自动换行
        style.setWrapText(true);
        
        创建sheet页
        HSSFSheet sheet = wb.createSheet("sheet页名称");
        // 设置某列为自动列宽
        sheet.autoSizeColumn(0);
        // 设置默认列宽
        sheet.setDefaultColumnWidth(20);
        // 设置列宽(列索引,字节长度 * 2 * 256)
        sheet.setColumnWidth(0,4 * 2 * 256);
        // 合并单元格
        sheet.addMergedRegion(new Region(0,(short)1,0,(short)2));
        
        创建一行
        HSSFRow row = sheet.createRow(0);
        // 设置行高
        row.setHeight((short) 1000);
        
        创建一个单元格
        HSSFCell cell = row.createCell(0);
        // 设置单元格风格
        cell.setCellStyle(style);
        cell.setCellValue(new HSSFRichTextString("支持富文本"));
        
        生成文件
        outputStream = new FileOutputStream(PATH + "demo.xls");
        wb.write(outputStream);
        outputStream.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

计算公式

java 复制代码
// 创建公式计算器
FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
// 执行计算
CellValue evaluate = formulaEvaluator.evaluate(cell);
evaluate.formatAsString();
相关推荐
大G哥19 小时前
pytest自动化测试数据驱动yaml/excel/csv/json
json·excel·pytest
小奥超人19 小时前
Excel粘贴复制不完整的原因以及解决方法
windows·经验分享·microsoft·excel·办公技巧
code04号19 小时前
python脚本:批量提取excel数据
开发语言·python·excel
m0_7482552621 小时前
vue3导入excel并解析excel数据渲染到表格中,纯前端实现。
前端·excel
左漫在成长1 天前
王佩丰24节Excel学习笔记——第十九讲:Indirect函数
笔记·学习·excel
Just_Paranoid1 天前
解析 Java 项目生成常量、变量和函数 Excel 文档
java·python·正则表达式·excel·javadoc
H4_xy1 天前
Excel中match()函数
excel
左漫在成长1 天前
王佩丰24节Excel学习笔记——第十八讲:Lookup和数组
笔记·学习·excel
扶尔魔ocy1 天前
【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
qt·pdf·ocr·excel
今天不学习明天变拉吉1 天前
大批量数据导入接口的优化
java·excel