自己写的一个工具类,传入拿到的数据,并且可以邻近相同数据的util
/**
* 把从数据库读出的数据写成excel
*/
public class WriteExcelUtil {
public int writeExcel(String filePath , List<Map<String, Object>> data) throws IOException {
//创建excel
HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
HSSFSheet sheet = wb.createSheet("人员信息");//创建工作表并命名
HSSFCellStyle cellStyle = wb.createCellStyle();//创建单元格样式
//写入数据
writeData(sheet,data);
//合并单元格
//行合并
mergeCell(sheet);
//列合并
mergeRow(sheet);
//以 文件名 + 精确到秒的时间.xls 的格式命名
FileOutputStream out = new FileOutputStream(filePath+"sample"+ getTime() +".xls");
wb.write(out);
out.close();//关闭文件流
return 1;
}
/**
*
* @return
*/
public String getTime(){
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String time = dateFormat.format( now );
return time;
}
/**
* 数据写入sheet
* @param sheet
* @param data
* @return
*/
public int writeData(HSSFSheet sheet,List<Map<String, Object>> data){
for (int i=0;i<data.size();i++) {
HSSFRow row = sheet.createRow(i);
//int num = 0;
int len = data.get(i).size();
for (int j=1;j <= 27;j++) {
;
row.createCell(j-1).setCellValue(data.get(i).get("COL"+j).toString()); //设置Excel工作表的值
}
}
return 1;
}
/**
* 比较列中相同单元格并合并
* @param sheet
* @return
*/
public int mergeRow(HSSFSheet sheet){
int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
int cellNum = sheet.getRow(0).getLastCellNum(); //总共的列数量 注意:此处有n行获取到n
int strat=-1,end=-1,flag=-1;
String cellValue1="",cellValue2="";
for(int i=0;i < cellNum ;i++) {
for (int j = 0; j < rowNum - 1; j++) {
cellValue1 = sheet.getRow(j).getCell(i).getStringCellValue();
cellValue2 = sheet.getRow(j + 1).getCell(i).getStringCellValue();
//相等则记录相等起始位置
if( cellValue1.trim().equals(cellValue2.trim()) ){
if(strat == -1 ){
strat=j; //
end=j+1;
flag=i;
}else{
end++;
}
}else{
if(strat !=-1 ){
sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
strat=-1;
end=-1;
flag=-1;
}
}
//判断此列是否结束 且 是否需要合并单元格
if(strat !=-1 && j == rowNum - 2 ){
sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
strat=-1;
end=-1;
flag=-1;
}
}
}
if(strat !=-1 ){
sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
strat=-1;
end=-1;
flag=-1;
}
return 1;
}
/**
* 合并单元格行
* @param sheet
* @return
*/
public int mergeCell(HSSFSheet sheet){
int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
int cellNum = sheet.getRow(0).getLastCellNum(); //总共的列数量 注意:此处有n行获取到n
int strat=-1,end=-1,flag=-1;
String cellValue1="",cellValue2="";
for(int i=0;i < rowNum ;i++){
for(int j=0;j < cellNum - 1;j++){
cellValue1=sheet.getRow(i).getCell(j).getStringCellValue();
cellValue2=sheet.getRow(i).getCell(j+1).getStringCellValue();
if( cellValue1.trim().equals(cellValue2.trim()) ){
if(strat == -1 ){
strat=j;
end=j+1;
flag=i;
}else{
end++;
}
}else{
if(strat !=-1 ){
sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
strat=-1;
end=-1;
flag=-1;
}
}
//判断此列是否结束 且 是否需要合并单元格
if(strat !=-1 && j == rowNum - 2 ){
sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
strat=-1;
end=-1;
flag=-1;
}
}
}
if(strat !=-1 ){
sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
strat=-1;
end=-1;
flag=-1;
}
return 1;
}
}
下面展示一组设计好的数据合并成的表头