Apache POI导出excel

常用的类和方法

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)组成

基础示例(代码仅供参考,)

// 读取模板excel
     String mbPath = baseDir + "WEB-INF\\xls\\pjq.xls";
     InputStream is = new FileInputStream(new File(mbPath));
     // HSSFWorkbook 工作簿,代表一个excel的整个文档
     // 创建一个新的工作簿 关联输入流的工作簿,可以将一个excel文件封装成工作簿
     HSSFWorkbook wb = new HSSFWorkbook(is);
    //数据库获取数据list封装
     listBean = DBHelper.getDBeanList(con, sql, null);
     exportGmyp(wb, listBean,realname);
     // 设置目标文件路径
     String uuid = UUID.randomUUID().toString();
     mdPath = baseDir + "WEB-INF\\xls\\" + uuid + ".xls";
     FileOutputStream os = new FileOutputStream(mdPath);
     wb.write(os);
     os.close();
private void exportGmyp(HSSFWorkbook wb, List<DBean> listBean,String realname) {
        HSSFRow row;  //行
        HSSFCell cell; //单元格
        int index = 0;
        //Sheet标签页--第一个标签页
        HSSFSheet sheet = wb.getSheetAt(0);//通过索引获取第一个Sheet,索引从0开始
        //CellRangeAddress  对象的构造方法需要传入合并单元格的首行、最后一行、首列、最后一列。
        CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 7);
        sheet.addMergedRegion(cra);//合并单元格所使用的方法

        //创建表头(跨多列)
        row = sheet.createRow(0);//创建新行,需要指定行号,行号从0开始(第一行)
        row.setHeightInPoints(25); // 设置行的高度
        cell = row.createCell(index++);// 创建新的单元格(第一个单元格)
        Date date = new Date();
        SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
        String format = df1.format(date);
        cell.setCellValue("统计日期:" + format+"                                                                         "+realname); //设置单元格的值

        row = sheet.createRow(1);//创建新行,需要指定行号,行号从0开始(第2行)
        int index1 = 0;
        cell = row.createCell(index1++);// 创建新的单元格(第一个单元格)
        cell.setCellValue("序号"); //序号
        cell = row.createCell(index1++);
        cell.setCellValue("批号"); //批号
        cell = row.createCell(index1++);
        cell.setCellValue("贴号列");
        cell = row.createCell(index1++);
        cell.setCellValue("水印纸号列");
        cell = row.createCell(index1++);
        cell.setCellValue("作废时间");
        cell = row.createCell(index1++);
        cell.setCellValue("接收时间");
        cell = row.createCell(index1++);
        cell.setCellValue("作废原因");
        cell = row.createCell(index1++);
        cell.setCellValue("公证员签字");
        cell = row.createCell(index1++);
        row.setHeightInPoints(30); // 设置行的高度
        sheet.setColumnWidth(0, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(1, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(2, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(3, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(4, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(5, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(6, 15 * 256); // 设置列的宽度
        sheet.setColumnWidth(7, 15 * 256); // 设置列的宽度

        for (int i = 0; i < listBean.size(); i++) {
            String xh = listBean.get(i).getString("rownum"); //序号
            String jh = listBean.get(i).getString("jh"); //批号
            String thl = "";//贴号列
            String sythl = StringUtil.null2String(listBean.get(i).getString("lmnf") + listBean.get(i).getString("bh"));//水印贴号列
            String zfsj = listBean.get(i).getString("czsj"); //作废时间
            Date day = new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            String jssj = df.format(day);//接收时间-当前时间
            String zfyy = listBean.get(i).getString("bz"); //作废原因
            String gzyqz = ""; //公证员签字

            int index2 = 0;
            row = sheet.createRow(i+2);//循环遍历row(第3行开始循环创建 行 )
            cell = row.createCell(index2++); //第1个单元格
            cell.setCellValue(StringUtil.null2String(xh));//序号

            cell = row.createCell(index2++); //第2个单元格
            cell.setCellValue(StringUtil.null2String(jh));//批号
            cell = row.createCell(index2++);//第3个单元格
            cell.setCellValue(StringUtil.null2String(thl));
            cell = row.createCell(index2++);//第4个单元格
            cell.setCellValue(StringUtil.null2String(sythl));//水印贴号列
            cell = row.createCell(index2++);//第5个单元格
            cell.setCellValue(StringUtil.null2String(zfsj));//作废时间
            cell = row.createCell(index2++);//第6个单元格
            cell.setCellValue(StringUtil.null2String(jssj));//接收时间-当前时间
            cell = row.createCell(index2++);//第7个单元格
            cell.setCellValue(StringUtil.null2String(zfyy));//作废原因
            cell = row.createCell(index2++);//第8个单元格
            cell.setCellValue(StringUtil.null2String(gzyqz));//公证员签字
            row.setHeightInPoints(20); // 设置行的高度

        }


        int size = listBean.size();
        int index3=0;
        //CellRangeAddress  对象的构造方法需要传入合并单元格的首行、最后一行、首列、最后一列。
        CellRangeAddress cra1 = new CellRangeAddress(size+3,size+3 , 0, 7);
        sheet.addMergedRegion(cra1);//合并单元格所使用的方法
        row = sheet.createRow(size+3);
        row.setHeightInPoints(25); // 设置行的高度
        cell = row.createCell(index3++); //第1个单元格
        cell.setCellValue("档案管理员签字:"+"                                   "+"审批签字:");
        cell = row.createCell(index3++);
    }

效果图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache poi 导出excel时合并单元格可以使用setRegionStyle方法来设置合并单元格的样式。这个方法接受三个参数,分别是Sheet对象、CellRangeAddress对象和CellStyle对象。在这个方法中,通过循环遍历合并单元格的每一行和每一列,然后获取对应的单元格并设置样式。具体的代码实现可以参考引用\[1\]中的示例代码。 此外,还可以使用PoiModel类来定义导出excel时的数据模型。这个类包含了内容、上一行同一位置内容、行标、列标等属性。可以根据实际需求来使用这个类。具体的代码实现可以参考引用\[2\]和引用\[3\]中的示例代码。 总结起来,Apache poi 导出excel时合并单元格的步骤包括设置合并单元格的样式和定义导出数据的模型。可以根据具体的需求来使用相应的方法和类来实现导出功能。 #### 引用[.reference_title] - *1* *3* [poi 导出Excel 动态 合并单元格](https://blog.csdn.net/weixin_65436454/article/details/127806178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用POI 导出Excel 动态合并单元格](https://blog.csdn.net/weixin_41722928/article/details/112849624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值