java中poi 生成表格报扩展名无效

 

一 :简介

开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel

  • Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。

    官方主页: http://poi.apache.org/index.html 
    API文档: http://poi.apache.org/apidocs/index.html

  • Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。

由于apache poi 在项目中用的比较多,本篇博客只讲解apache poi,不讲jxl


二:Apache POI常用的类

  • HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
  • XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
  • HWPF - 提供读写Microsoft Word DOC97格式档案的功能。
  • XWPF - 提供读写Microsoft Word DOC2003格式档案的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF - 提供读Microsoft Visio格式档案的功能。
  • HPBF - 提供读Microsoft Publisher格式档案的功能。
  • HSMF - 提供读Microsoft Outlook格式档案的功能。

在开发中我们经常使用HSSF用来操作Excel处理表格数据,对于其它的不经常使用。

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

常用的类和方法

  • HSSFWorkbook :工作簿,代表一个excel的整个文档 
    • HSSFWorkbook(); // 创建一个新的工作簿
    • HSSFWorkbook(InputStream inputStream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
    • HSSFSheet createSheet(String sheetname); 创建一个新的Sheet
    • HSSFSheet getSheet(String sheetName); 通过名称获取Sheet
    • HSSFSheet getSheetAt(int index); // 通过索引获取Sheet,索引从0开始
    • HSSFCellStyle createCellStyle(); 创建单元格样式
    • int getNumberOfSheets(); 获取sheet的个数
    • setActiveSheet(int index); 设置默认选中的工作表
    • write();
    • write(File newFile);
    • write(OutputStream stream);
  • HSSFSheet:工作表 
    • HSSFRow createRow(int rownum); 创建新行,需要指定行号,行号从0开始
    • HSSFRow getRow(int index); 根据索引获取指定的行
    • int addMergedRegion(CellRangeAddress region); 合并单元格 
      CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。
    • autoSizeColumn(int column); 自动调整列的宽度来适应内容
    • getLastRowNum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
    • setColumnWidth(int columnIndex, int width); 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256
  • HSSFRow :行 
    • HSSFCell createCell(int column); 创建新的单元格
    • HSSFCell setCell(shot index);
    • HSSFCell getCell(shot index);
    • setRowStyle(HSSFCellStyle style); 设置行样式
    • short getLastCellNum(); 获取最后的单元格号,如果单元格有第一个开始算,lastCellNum就是列的个数
    • setHeightInPoints(float height); 设置行的高度
  • HSSFCell:单元格 
    • setCellValue(String value); 设置单元格的值
    • setCellType(); 设置单元格类型,如 字符串、数字、布尔等
    • setCellStyle(); 设置单元格样式
    • String getStringCellValue(); 获取单元格中的字符串值
    • setCellStyle(HSSFCellStyle style); 设置单元格样式,例如字体、加粗、格式化
    • setCellFormula(String formula); 设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和”sum(A1,C1)”、日期函数、字符串相关函数、CountIf和SumIf函数、随机数函数等
  • HSSFCellStyle :单元格样式 
    • setFont(Font font); 为单元格设置字体样式
    • setAlignment(HorizontalAlignment align); // 设置水平对齐方式
    • setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
    • setFillPattern(FillPatternType fp);
    • setFillForegroundColor(short bg); 设置前景色
    • setFillBackgroundColor(short bg); 设置背景颜色
  • HSSFFont:字体, 
    • setColor(short color); // 设置字体颜色
    • setBold(boolean bold); // 设置是否粗体
    • setItalic(boolean italic); 设置倾斜
    • setUnderline(byte underline); 设置下划线
  • HSSFName:名称
  • HSSFDataFormat :日期格式化
  • HSSFHeader : Sheet的头部
  • HSSFFooter :Sheet的尾部
  • HSSFDateUtil :日期工具
  • HSSFPrintSetup :打印设置
  • HSSFErrorConstants:错误信息表

Excel中的工作簿、工作表、行、单元格中的关系:

一个Excel文件对应于一个workbook(HSSFWorkbook),
一个workbook可以有多个sheet(HSSFSheet)组成,
一个sheet是由多个row(HSSFRow)组成,
一个row是由多个cell(HSSFCell)组成

二 问题及处理

两种格式:xlsx对应XSSFWorkbook,xls对应HSSFWorkbook
Workbook wb = null;
if (isxlsx) {
    wb = new XSSFWorkbook();
    fileName += ".xlsx";
} else {
    wb = new HSSFWorkbook();
    fileName += ".xls";
}

如果生成表格报扩展名错误,一般就是使用时没有注意到对应关系。

导出表格,只有字段标题,没有内容(可以进行扩充,然后进行插入数据)
public static void exportExcel(HttpServletResponse response, boolean isxlsx, String fileName, String[] heads)
            throws Exception {

        Workbook wb = null;
        if (isxlsx) {
            wb = new XSSFWorkbook();
            fileName += ".xlsx";
        } else {
            wb = new HSSFWorkbook();
            fileName += ".xls";
        }

        try {
            fileName = new String(fileName.getBytes("gb2312"), "ISO8859-1");
        } catch (UnsupportedEncodingException e) {
            logger.error("string encode error", e);
        }

        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        Sheet sheet = wb.createSheet("sheet1");
        fillTitle(sheet, heads);
        try {
            OutputStream os = response.getOutputStream();
            Workbook wb2 = wb;
            wb2.write(os);
            os.flush();
            os.close();
        } catch (IOException e) {
            logger.error("export error", e);
        }
    }

    private static void fillTitle(Sheet sheet, String[] heads) {
        //创建行
        Row row = sheet.createRow(0);
        for (int i = 0; i < heads.length; i++) {
            //创建列
            Cell cell = row.createCell(i);
            //设置值
            cell.setCellValue(heads[i]);
        }
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用POI生成表格并自定义标题的Java示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelGenerator { public static void main(String[] args) throws IOException { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("表格名称"); // 创建自定义标题行 Row titleRow = sheet.createRow(0); CellStyle titleStyle = workbook.createCellStyle(); titleStyle.setAlignment(HorizontalAlignment.CENTER); Font titleFont = workbook.createFont(); titleFont.setBold(true); titleFont.setFontHeightInPoints((short) 14); titleStyle.setFont(titleFont); Cell titleCell = titleRow.createCell(0); titleCell.setCellValue("自定义标题"); titleCell.setCellStyle(titleStyle); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); // 创建表头行 Row headerRow = sheet.createRow(1); String[] headers = {"列1", "列2", "列3", "列4"}; CellStyle headerStyle = workbook.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); for (int i = 0; i < headers.length; i++) { Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(headers[i]); headerCell.setCellStyle(headerStyle); } // 创建数据行 Object[][] data = { {"数据1-1", "数据1-2", "数据1-3", "数据1-4"}, {"数据2-1", "数据2-2", "数据2-3", "数据2-4"}, {"数据3-1", "数据3-2", "数据3-3", "数据3-4"} }; CellStyle dataStyle = workbook.createCellStyle(); dataStyle.setAlignment(HorizontalAlignment.CENTER); for (int i = 0; i < data.length; i++) { Row dataRow = sheet.createRow(i + 2); for (int j = 0; j < data[i].length; j++) { Cell dataCell = dataRow.createCell(j); dataCell.setCellValue(data[i][j].toString()); dataCell.setCellStyle(dataStyle); } } // 调整列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 输出到文件 FileOutputStream outputStream = new FileOutputStream("表格文件名.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); } } ``` 在上面的示例,我们通过以下步骤生成了一个包含自定义标题和表头的表格: 1. 创建工作簿。 2. 创建工作表。 3. 创建自定义标题行,并设置样式和字体。 4. 合并自定义标题单元格。 5. 创建表头行,并设置样式和字体。 6. 创建数据行,并设置样式。 7. 调整列宽。 8. 输出到文件。 你可以根据需要修改代码表格名称、自定义标题、表头、数据和输出文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值