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();
相关推荐
理想不理想v2 小时前
[经典] 前端js将文件流导出为csv/excel文件
前端·javascript·excel
m0_589828872 小时前
Excel根据条件动态索引单元格范围
excel
匆匆整棹还2 小时前
已有账号,重装系统激活office后发现没有ppt,word,excel等
word·powerpoint·excel
spjhandsomeman2 小时前
EXCEL 或 WPS 列下划线转驼峰
excel·wps
用一个不重复的昵称12 小时前
python数据写入excel文件
python·excel·pandas
慧都小妮子12 小时前
借助Aapose.Cells ,在 Node.js 中将 Excel 转换为 JSON
node.js·json·excel·aspose.cells
神奇夜光杯16 小时前
Python酷库之旅-第三方库Pandas(211)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
流形填表16 小时前
pdf的统计图表数据提取;图表转excel
pdf·excel
Python大数据分析@19 小时前
为什么用SQL而不是Excel+VBA?
数据库·sql·excel
神奇夜光杯1 天前
Python酷库之旅-第三方库Pandas(208)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长