java excel表格合并多列_java 通用的导出 excel 合并单元格格式(二)

本文提供了一个Java Excel导出工具类,实现了读取文本文件获取Excel标题,并支持Excel表格多列合并的功能。通过创建HSSFWorkbook对象,设置合并单元格的样式,以及使用CellRangeAddress进行单元格范围合并,可以方便地生成带有合并单元格的Excel文件。
摘要由CSDN通过智能技术生成

package com.nskj.utils;

import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.text.DecimalFormat;

import java.text.SimpleDateFormat;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Scanner;

import java.util.Map.Entry;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFFont;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.util.CellRangeAddress;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;/***

* excel 导出工具类

* @author Administrator

**/

public classExcelUtil {private static DecimalFormat df = new DecimalFormat("0");//默认单元格格式化日期字符串

private static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");//格式化数字

private static DecimalFormat nf = new DecimalFormat("0.00");private final static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);/***

* 读取本地文件txt 获取excel标题

* @param path

* @return*/

public staticString getTitle(String path){

FileInputStream fis= null;

InputStreamReader isr= null;

BufferedReader br= null; //用于包装InputStreamReader,提高处理性能。因为BufferedReader有缓冲的,而InputStreamReader没有。

String str = "";

String str1= "";try{

fis= new FileInputStream(path);//FileInputStream//从文件系统中的某个文件中获取字节

isr = new InputStreamReader(fis,"UTF-8");//InputStreamReader 是字节流通向字符流的桥梁,//br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("")), "UTF-8"));

br = new BufferedReader(isr);//从字符输入流中读取文件中的内容,封装了一个new InputStreamReader的对象

while ((str = br.readLine()) != null) {

str1+= str + ",";

}

str1= str1.substring(0,str1.length()-1);//当读取的一行不为空时,把读到的str的值赋给str1

System.out.println(str1);//打印出str1

} catch(FileNotFoundException e) {

System.out.println("找不到指定文件");

}catch(IOException e) {

System.out.println("读取文件失败");

}finally{try{

br.close();

isr.close();

fis.close();//关闭的时候最好按照先后顺序关闭最后开的先关闭所以先关s,再关n,最后关m

} catch(IOException e) {

e.printStackTrace();

}

}return str1; //读取excel表头

}/***

* 读取服务器文件txt 获取excel标题

* @param fileName

* @return*/

publicString getFile(String fileName) {

StringBuilder result= new StringBuilder("");

String str1="";if(fileName.endsWith(".txt")){

ClassLoader classLoader=getClass().getClassLoader();

File file= newFile(classLoader.getResource(fileName).getFile());try (Scanner scanner = newScanner(file)) {while(scanner.hasNextLine()) {

String line=scanner.nextLine();

result.append(line).append(",");

}

scanner.close();

str1=result.toString();

str1= str1.substring(0,str1.length()-1);

}catch(IOException e) {

e.printStackTrace();

}

}if(fileName.endsWith(".xml")){

FileInputStream fis= null;

InputStreamReader isr= null;

BufferedReader br= null; //用于包装InputStreamReader,提高处理性能。因为BufferedReader有缓冲的,而InputStreamReader没有。

String str = "";

String str2="";try{

fis= new FileInputStream(this.getClass().getClassLoader().getResource("/").getPath()+"/"+fileName);

isr= new InputStreamReader(fis,"UTF-8");//InputStreamReader 是字节流通向字符流的桥梁,//br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("")), "UTF-8"));

br = new BufferedReader(isr);//从字符输入流中读取文件中的内容,封装了一个new InputStreamReader的对象

while ((str = br.readLine()) != null) {

str2+= str + ",";

}//str1 = str1.substring(0,str1.length()-1);//str1 =str1.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>,", "");//int str3=str2.indexOf(",");//str1 = str2.substring(str3+1,str2.length() -(str3+1));

str1=str2.substring(str2.indexOf(',')+1).trim();

str1= str1.substring(0,str1.length()-1);

}catch(IOException e) {

e.printStackTrace();

}

}returnstr1;

}//2. writeIntoExcel() 将datatable 数据写入excel

/*public static void writeExcel(ArrayList> result,String path){

if(result == null){

return;

}

HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet("sheet1");

for(int i = 0 ;i < result.size() ; i++){

HSSFRow row = sheet.createRow(i);

if(result.get(i) != null){

for(int j = 0; j < result.get(i).size() ; j ++){

HSSFCell cell = row.createCell(j);

cell.setCellValue(result.get(i).get(j).toString());

}

}

}

ByteArrayOutputStream os = new ByteArrayOutputStream();

try

{

wb.write(os);

} catch (IOException e){

e.printStackTrace();

}

byte[] content = os.toByteArray();

File file = new File(path);//Excel文件生成后存储的位置。

OutputStream fos = null;

try

{

fos = new FileOutputStream(file);

fos.write(content);

os.close();

fos.close();

}catch (Exception e){

e.printStackTrace();

}

}*/

public static void export(List>list, String filename, HttpServletResponse response, String titles) {try{

response.setContentType("application/x-execl");

response.setHeader("Content-Disposition","attachment;filename=" + new String(filename.getBytes(), "ISO-8859-1"));

ServletOutputStream outputStream=response.getOutputStream();

exportExcel(list, filename, outputStream, titles);if (outputStream != null) {

outputStream.close();

}

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/**

* 数据导出公用方法

**/

public static void exportExcel(List>list, String filename, ServletOutputStream outputStream,String titles) {try{

Map map1 = list.get(0);

StringBuilder sb= newStringBuilder();

String[] fields=titles.split(",");/*sb.append(title);

String[] fields = sb.toString().split(",");*/

//1、创建工作簿

HSSFWorkbook workbook = newHSSFWorkbook();//1.1、创建合并单元格对象

CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, fields.length - 1);//起始行号,结束行号,起始列号,结束列号

CellRangeAddress cellRangeAddress1 = new CellRangeAddress(1, 1, 0, fields.length - 1);//起始行号,结束行号,起始列号,结束列号

CellRangeAddress cellRangeAddress2 = new CellRangeAddress(1, 1, 7, 12);//起始行号,结束行号,起始列号,结束列号//1.2、头标题样式

HSSFCellStyle style1 = createCellStyle(workbook, (short) 18);//1.3、列标题样式

HSSFCellStyle style2 = createCellStyle(workbook, (short) 13);

String headRow=filename;//2、创建工作表

HSSFSheet sheet =workbook.createSheet(headRow);//2.1、加载合并单元格对象

sheet.addMergedRegion(cellRangeAddress);

sheet.addMergedRegion(cellRangeAddress1);

sheet.addMergedRegion(cellRangeAddress2);//sheet.addMergedRegion(cellRangeAddress4);//设置默认列宽

sheet.setDefaultColumnWidth(22);

sheet.setDefaultRowHeightInPoints(22);

sheet.autoSizeColumn(1, true);//

//3、创建行//3.1、创建头标题行;并且设置头标题

HSSFRow row1 = sheet.createRow(0);

row1.setHeightInPoints(50);

HSSFCell cell1= row1.createCell(0);//加载单元格样式

cell1.setCellStyle(style1);

cell1.setCellValue(headRow);//3.1、创建副标题行;并且设置

HSSFRow row2 = sheet.createRow(1);

row2.setHeightInPoints(25);

HSSFCell cell2= row2.createCell(0);//3.2、创建列标题行;并且设置列标题

HSSFRow row3 = sheet.createRow(2);/*String[] titles = new String[fields.length];

for (int i = 0; i < fields.length; i++) {

titles[i] = getTitles(type, fields[i]);

}*/

for (int i = 0; i < fields.length; i++) {

HSSFCell cell5=row3.createCell(i);//加载单元格样式

cell5.setCellStyle(style2);

cell5.setCellValue(fields[i]);

}//备注详情

HSSFRow row36 = sheet.createRow(1);

row36.setHeightInPoints(18);

HSSFCell cell36= row36.createCell(0);//加载单元格样式

HSSFCellStyle style36 =workbook.createCellStyle();

style36.setAlignment(HSSFCellStyle.ALIGN_LEFT);//水平居左

style36.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

cell36.setCellStyle(style36);

HSSFFont font=workbook.createFont();

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体

font.setFontHeightInPoints((short) 16);

style36.setFont(font);//cell36.setCellValue(data_batch);//自适应中文//4、操作单元格;写入excel

if (list != null && list.size() > 0) {for (int j = 0; j < list.size(); j++) {

Map map = list.get(j);//Object bean = getBean(type, map);

HSSFRow row = sheet.createRow(j + 3);int i=0;for(Map.Entryentry:map.entrySet()){

String val="";if((entry.getValue())!=null && (entry.getValue()) !="null"){

val=getValue( entry.getKey(),entry.getValue().toString());

}else{

val=" ";

}//String val=() ? entry.getValue().toString() : "null";

HSSFCell cell =row.createCell(i);

i++;

cell.setCellValue(val);

logger.info("第" + (j+3) + "行,第" + val+ "--赋值成功");

}/*for (int i = 0; i < fields.length; i++) {

//String value = CommonUtil.getValue(bean, StringUtils.toCamelCase(fields[i]));

//value = getValue(fields[i], value);

//cell.setCellValue(value);

cell.setCellValue(list.get(j).get(i).toString());

//cell.setCellValue(list.get(j).get(i).toString());

}*/}

}//5、输出

workbook.write(outputStream);

outputStream.flush();

outputStream.close();

}catch(Exception e) {

e.printStackTrace();

}

}/**

* 创建单元格样式

*

* @param workbook

* 工作簿

* @param fontSize

* 字体大小

* @return 单元格样式*/

private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, shortfontSize) {

HSSFCellStyle style=workbook.createCellStyle();

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中//创建字体

HSSFFont font =workbook.createFont();

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体

font.setFontHeightInPoints(fontSize);//加载字体

style.setFont(font);returnstyle;

}public staticString getValue(String field, String value) {if (field.equals("credLocation")) {if (value.equals("1")) {

value= "库内人员";

}if (value.equals("2")) {

value= "库外人员";

}

}if (field.equals("chongfu")) {if (value.equals("1")) {

value= "否";

}else{

value= "是";

}

}if (field.equals("days")) {if (value.contains("-")) {

String value1= "逾期"+value+"天";

value=value1.replace("-", "");

}else{

value= value+"天后保养";

}

}if (field.equals("recordStatus")) {if (value.equals("1")) {

value= "故障报修";

}else if (value.equals("2")){

value= "已派工";

}else if(value.equals("3")){

value= "已出发";

}else if(value.equals("4")){

value= "到达现场";

}else if(value.equals("5")){

value= "维修完成";

}else if(value.equals("6")){

value= "服务评定";

}

}returnvalue;

}public staticDecimalFormat getDf() {returndf;

}public static voidsetDf(DecimalFormat df) {

ExcelUtil.df=df;

}public staticSimpleDateFormat getSdf() {returnsdf;

}public static voidsetSdf(SimpleDateFormat sdf) {

ExcelUtil.sdf=sdf;

}public staticDecimalFormat getNf() {returnnf;

}public static voidsetNf(DecimalFormat nf) {

ExcelUtil.nf=nf;

}/**

* 多行表头

* dataList:导出的数据;sheetName:表头名称; head0:表头第一行列名;headnum0:第一行合并单元格的参数

* head1:表头第二行列名;headnum1:第二行合并单元格的参数;detail:导出的表体字段

**/

public static voidreportMergeXls(HttpServletRequest request,

HttpServletResponse response, List>dataList,

String sheetName, String[] head0, String[] headnum0,

String[] head1, String[] headnum1, String[] detail)

throws Exception {

HSSFWorkbook workbook= newHSSFWorkbook();//1、创建标题

String headRow =sheetName;//1.1、头标题样式

HSSFCellStyle headstyle = createCellStyle(workbook, (short) 18);//1.2、列标题样式

HSSFCellStyle style1 = createCellStyle(workbook, (short) 13);//2、创建工作表

HSSFSheet sheet =workbook.createSheet(headRow);//设置默认列宽

sheet.setDefaultColumnWidth(22);

sheet.setDefaultRowHeightInPoints(22);

sheet.autoSizeColumn(1, true);//3、创建行//3.1、创建头标题行;并且设置头标题

HSSFRow row1 = sheet.createRow(0);

row1.setHeightInPoints(50);

HSSFCell cell1= row1.createCell(0);//加载单元格样式

cell1.setCellStyle(headstyle);

cell1.setCellValue(headRow);//3.1、创建副标题行;并且设置

HSSFRow row2 = sheet.createRow(1);

row2.setHeightInPoints(25);

HSSFCell cell2= row2.createCell(0);//3.2、创建列标题行;并且设置列标题

HSSFRow row3 = sheet.createRow(2);//第一行表头标题

sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head0.length-1));

HSSFRow row= sheet.createRow(0);

row.setHeight((short) 0x349);

HSSFCell cell= row.createCell(0);

cell.setCellStyle(headstyle);

CellUtil.setCellValue(cell, sheetName);//第二行表头列名

row = sheet.createRow(1);for (int i = 0; i < head0.length; i++) {

cell=row.createCell(i);

cell.setCellValue(head0[i]);

cell.setCellStyle(style1);

}//1.3、普通单元格样式(中文)样式

HSSFCellStyle style2 =workbook.createCellStyle();//HSSFCellStyle style36 = workbook.createCellStyle();

style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);//水平居左

style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

HSSFFont font =workbook.createFont();

font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗字体

font.setFontHeightInPoints((short) 10);

style2.setFont(font);//动态合并单元格

for (int i = 0; i < headnum0.length; i++) {

String[] temp= headnum0[i].split(",");

Integer startrow= Integer.parseInt(temp[0]);

Integer overrow= Integer.parseInt(temp[1]);

Integer startcol= Integer.parseInt(temp[2]);

Integer overcol= Integer.parseInt(temp[3]);

sheet.addMergedRegion(newCellRangeAddress(startrow, overrow,

startcol, overcol));

}//设置合并单元格的参数并初始化带边框的表头(这样做可以避免因为合并单元格后有的单元格的边框显示不出来)

row = sheet.createRow(2);//因为下标从0开始,所以这里表示的是excel中的第三行

for (int i = 0; i < head0.length; i++) {

cell=row.createCell(i);

cell.setCellStyle(style1);//设置excel中第四行的1、2、7、8列的边框

if(i > 1) {for (int j = 0; j < head1.length; j++) {

cell= row.createCell(j + 1);

cell.setCellValue(head1[j]);//给excel中第三行的3、4、5、6列赋值("温度℃", "湿度%", "温度℃", "湿度%")

cell.setCellStyle(style1);//设置excel中第三行的3、4、5、6列的边框

}

}

}//动态合并单元格

for (int i = 0; i < headnum1.length; i++) {

String[] temp= headnum1[i].split(",");

Integer startrow= Integer.parseInt(temp[0]);

Integer overrow= Integer.parseInt(temp[1]);

Integer startcol= Integer.parseInt(temp[2]);

Integer overcol= Integer.parseInt(temp[3]);

sheet.addMergedRegion(newCellRangeAddress(startrow, overrow,

startcol, overcol));

}//设置列值-内容

for (int i = 0; i < dataList.size(); i++) {

row= sheet.createRow(i + 3);//标题、时间、表头字段共占了3行,所以在填充数据的时候要加3,也就是数据要从第4行开始填充

for (int j = 0; j < detail.length; j++) {

Map tempmap= (HashMap) dataList.get(i);

Object data= tempmap.get(detail[j]);

cell=row.createCell(j);

cell.setCellStyle(style2);

cell.setCellType(HSSFCell.CELL_TYPE_STRING);

CellUtil.setCellValue(cell, data);

}

}

String fileName= new String(sheetName.getBytes("gb2312"), "ISO8859-1");

ByteArrayOutputStream baos= newByteArrayOutputStream();

workbook.write(baos);

response.setContentType("application/x-download;charset=utf-8");

response.addHeader("Content-Disposition", "attachment;filename="

+ fileName + ".xls");

OutputStream os=response.getOutputStream();

ByteArrayInputStream bais= newByteArrayInputStream(baos.toByteArray());byte[] b = new byte[1024];while ((bais.read(b)) > 0) {

os.write(b);

}

bais.close();

os.flush();

os.close();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值