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();
相关推荐
城数派1 小时前
2005-2025年我国省市县三级的逐日露点温度数据(Shp/Excel格式)
excel
码农很忙1 小时前
AI赋能表格革命:告别Excel痛点,开启数据处理新纪元
人工智能·excel
骆驼爱记录1 小时前
3步删除Word目录空白行
自动化·word·excel·wps·新人首发
城数派9 小时前
2005-2025年我国乡镇级的逐日最低气温数据(Shp/Excel格式)
数据分析·excel
SuperEugene10 小时前
Excel 上传解析 + 导出实战:Vue+xlsx 避坑指南|Vue生态精选
前端·javascript·vue.js·excel·xlsx·vxetable
领小10 小时前
VS2022 MFC对话框应用OLE读写操作excel
c++·excel·mfc
一点 内容10 小时前
企业级 Web Excel 多人实时在线协同:技术实现与核心突破
excel
TE-茶叶蛋10 小时前
从零实现H5 表格协同编辑:Yjs + WebSocket 实战
websocket·小程序·excel
mr_LuoWei200910 小时前
自定义的中文脚本解释器来实现对excel自动化处理(一)
python·自动化·excel
softbangong11 小时前
901-excel编辑工具
microsoft·自动化·excel·办公自动化·数据处理·excel操作·excel工具