Java使用HSSFWorkbook导出excel

               同学们学习java时,导出可能使用简单的IO比较多,导出execl功能可能不太了解,刚刚好今天写了一个导出功能,给大家参考:

需求:根据地市分别查出各个地市部门的相关内容,再根据不同专业分表在一个execl文件导出

大家应该发现了要点:涉及到execl的内容填写和表格的行列合并,会了这些操作基本上就能应对大部分的execl导出功能实现

主要思路:合并好单元格,填写好固定的列名,然后遍历填写地市和地市相关数据

直接上代码和注释:

		// 创建一个Excel表格
		HSSFWorkbook workbook = new HSSFWorkbook();
        // 创建自己的数据结构保存数据
		Map<String,List> execl = new HashMap<>();
//外层循环遍历分表条件分表
for (int j = 0; j < itemspeccode.length; j++) {
//创建数据类型存储一张表内的数据
			List<Map<String, Map>> ltList = new ArrayList<>();
//遍历表内需要查询的数据
			for (int i = 0; i < lt.length; i++) {
//查出一行数据
				Map<String,Map> result =iMssProjectWarnService.getexeclConstructionCokpit(latnId, lt[i], itemspeccode[j]);
				ltList.add(result);
			}
	        execl.put(getName(itemspeccode[j]),ltList);
//创建分表和命名,就是下方的sheet1,2,3...这种
			HSSFSheet sheet = workbook.createSheet(getName(itemspeccode[j]));
//设计列的宽度(列,宽度)
			sheet.setColumnWidth(1, 6000);
			sheet.setColumnWidth(2, 6000);
			sheet.setColumnWidth(3, 6000);
			sheet.setColumnWidth(4, 6000);
			sheet.setColumnWidth(5, 6000);
			sheet.setColumnWidth(6, 6000);
			sheet.setColumnWidth(7, 6000);
			sheet.setColumnWidth(8, 6000);
			sheet.setColumnWidth(9, 6000);
			sheet.setColumnWidth(10, 6000);
			sheet.setColumnWidth(11, 6000);
			sheet.setColumnWidth(12, 6000);
//合并单元格和添加数据
			HSSFRow row0 = sheet.createRow(0);
			HSSFCell cell0 = row0.createCell(0);
			cell0.setCellValue(getName(itemspeccode[j]));
//合并单元格CellRangeAddress(起始行,结束行,起始列,结束列)
			sheet.addMergedRegion(new CellRangeAddress(0,0,0,10));
			sheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
			sheet.addMergedRegion(new CellRangeAddress(1,1,1,6));
			sheet.addMergedRegion(new CellRangeAddress(1,1,7,12));
//添加数据以起始行为赋值位置
			HSSFRow row12 = sheet.createRow(1);
			row12.createCell(0).setCellValue("单位");
			row12.createCell(1).setCellValue("在建工程交付");
			row12.createCell(7).setCellValue("在建工程关闭");
//第一行填充固定名称数据
			HSSFRow row = sheet.createRow(2);
					row.createCell(1).setCellValue("当前交付超期工程数");
					row.createCell(2).setCellValue("当前在建工程数");
					row.createCell(3).setCellValue("当前在建工程超期率(%)");
					row.createCell(4).setCellValue("当年交付超期工程数");
					row.createCell(5).setCellValue("当年在建工程数");
					row.createCell(6).setCellValue("当年在建工程超期率(%)");
					row.createCell(7).setCellValue("当前关闭超期工程数");
					row.createCell(8).setCellValue("当前在建工程数");
					row.createCell(9).setCellValue("当前在建工程超期率(%)");
					row.createCell(10).setCellValue("当年关闭超期工程数");
					row.createCell(11).setCellValue("当年在建工程数");
					row.createCell(12).setCellValue("当年在建工程超期率(%)");

//遍历地市名称,一行一行循环添加
//提取的方法,execl就是前面定义的存储数据的数据结构,sheet就是开头定义HSSFSheet sheet = workbook.createSheet(getName(itemspeccode[j]));
			for (int i = 0; i < lt.length; i++) {
				extracted(execl, sheet, itemspeccode[j],getCityName(lt[i]),i,3);
			}
			HSSFRow row14 = sheet.createRow(14);
			row14.createCell(0).setCellValue("本地网");
		}
// 将Excel文件输出到输出流
		OutputStream outputStream = response.getOutputStream();
		workbook.write(outputStream);
		outputStream.flush();
		outputStream.close();
		workbook.close();
}

下面就是一个提取出来的方法用来一行一行填入,可能大家和我的填写方式不尽相同,但是可以参考,总结操作就是创建一个行然后加固定位置加数据

private void extracted(Map<String, List> execl, HSSFSheet sheet, String itemspeccode,String dishi,int i,int j) {
//从第n行开始添加
		HSSFRow row2 = sheet.createRow(j+i);
//选择表格位置填值操作,之后类似
		row2.createCell(0).setCellValue(dishi);
//查出数据
		Map<String,Map> o = (Map) execl.get(getName(itemspeccode)).get(i);
		Long num = (Long) o.get(dishi).get("当前交付超期");
//选择表格位置填值操作,之后类似
		row2.createCell(1).setCellValue(num);

//..........类似代码
	}

导出效果就是这样,和需求一模一样非常完美哦。要根据列去加行也是这样类似的操作。(关于这个表格个性化,应该也是有办法的,不过我还没去研究)

原创不易禁止转载哦

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HSSFWorkbook是NPOI库中用于导出Excel文件的一种方式。它是Excel的工作簿,可以包含多个工作表(HSSFSheet),而一个工作表又由多行(HSSFRow)和多个单元格(HSSFCell)组成。此外,HSSFWorkbook还提供了一些其他功能,如设置字体(HSSFFont)、日期格式(HSSFDataFormat)和单元格样式(HSSFCellStyle)。 下面是一个动态生成Excel文件的例子: ``` //创建HSSFWorkbook对象 HSSFWorkbook wb = new HSSFWorkbook(); //创建HSSFSheet对象 HSSFSheet sheet = wb.createSheet("sheet0"); //创建HSSFRow对象 HSSFRow row = sheet.createRow(0); //创建HSSFCell对象 HSSFCell cell = row.createCell(0); //设置单元格的值 cell.setCellValue("单元格中的中文"); //输出Excel文件 FileOutputStream output = new FileOutputStream("d:\\workbook.xls"); wb.write(output); output.flush(); ``` 以上代码会创建一个名为"sheet0"的工作表,并在第一行第一列的单元格中写入"单元格中的中文"。然后将工作簿保存为一个Excel文件(workbook.xls)并输出到指定路径中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Winform中通过NPOI导出Excel的三种方式HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook示例代码.zip](https://download.csdn.net/download/qq_35406995/16604372)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [使用HSSFWorkbook导出、操作excel](https://blog.csdn.net/caicai1171523597/article/details/86643667)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java中导入、导出Excel——HSSFWorkbook 使用](https://blog.csdn.net/qq_43842093/article/details/121109593)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值