import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 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.hssf.util.Region;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.remoting.WebRemote; import com.sunsheen.jfids.system.base.composite.data.query.QueryParameterImpl;
import com.sunsheen.jfids.system.database.DBSession;
import com.sunsheen.jfids.util.DataBaseUtil; public class SalaryPoi { @SuppressWarnings("deprecation")
public String getToExcel(){
......省略数据源获取
// 返回表单结果集
List list = query.list();
int size = list.size();
System.out.println("+++++++++++++" + size); //初始化POI
//创建工作簿---->XSSF代表10版的Excel(HSSF是07版前的Excel)
HSSFWorkbook wb = new HSSFWorkbook(); //工作表
HSSFSheet sheet = wb.createSheet("淞幸科技"); //标头行,代表第一行
HSSFRow head=sheet.createRow(0);
HSSFCell hssfCell=head.createCell(0); hssfCell.setCellValue("成都淞幸科技有限责任公司"+date.substring(0,4)+"年"+
date.substring(date.length()-2,date.length())+"月工资表");
head.setHeightInPoints(70); //合并第一行的单元格
CellRangeAddress address=new CellRangeAddress(0,0,0,26);
sheet.addMergedRegion(address); //创建字体与风格
HSSFCellStyle cellStyle = wb.createCellStyle();//生成表头格样式
HSSFFont hssfFont = wb.createFont();//创建字体
hssfFont.setFontHeightInPoints((short)12);//字体大小
hssfFont.setBoldweight(Font.BOLDWEIGHT_BOLD);//粗体
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
cellStyle.setFont(hssfFont);
hssfCell.setCellStyle(cellStyle); //修饰风格2
HSSFCellStyle cellStyle2 = wb.createCellStyle();//生成表头格样式
cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 HSSFRow header=sheet.createRow(1);
//创建单元格,0代表第一行第一列
String[] heards ={"序号","部门名称","工号","姓名","银行卡号","定级工资","岗位工资","基础
,"实发工资总额"......};
for(int i =0;i<heards.length;i++){
HSSFCell hssfCell1=header.createCell(i);
hssfCell1.setCellStyle(cellStyle2);
hssfCell1.setCellValue(heards[i]);
}
//设置列的宽度
// getPhysicalNumberOfCells()代表这行有多少包含数据的列
for(int i=0;i<header.getPhysicalNumberOfCells();i++){
//POI设置列宽度时比较特殊,它的基本单位是1/255个字符大小,
//因此我们要想让列能够盛的下20个字符的话,就需要用255*20
sheet.setColumnWidth(i, 255*15);
}
//设置行高,行高的单位就是像素,因此30就是30像素的意思
header.setHeightInPoints(30);
int k =2;
//
for(int i=0;i<size;i++){
// //创建多行数据
HSSFRow headers=sheet.createRow(k++);
// //拿出所有查询出的一条list(list(Map<>))信息
Map<String, Object> map = (Map<String, Object>) list.get(i);
System.out.println(map); String[] context ={你要写入的数据};
for(int j=0;j<context.length;j++){
HSSFCell hssfCell2=headers.createCell(j);
hssfCell2.setCellStyle(cellStyle2);
hssfCell2.setCellValue(context[j]);
}
} // 合并相同列中的数据
// 处理相同的数据合并单元格
if(sheet.getLastRowNum()>2){//获取最后一行行标,比行数小 满足合并的条件,2是数据行的开始,0 1 行为表头
HSSFRow row_1 = sheet.getRow(2);
HSSFCell cell_1 = row_1.getCell(1); String departname = cell_1.getStringCellValue(); for(int i=3;i<=sheet.getLastRowNum();i++){
//除第一个外,循环将内容相同的单元格设为"",这里体现出为什么原数据要有序!
HSSFRow rows = sheet.getRow(i);
//此处表示对单元格进行内容相同合并处理,我这里获取的是每行的第2列进行对比,要多列对比的,这里自行增加
HSSFCell cells_1 = rows.getCell(1);
//这里值相同则设置位空,方便之后的合并
if(departname.equals(cells_1.getStringCellValue())){
cells_1.setCellValue("");
}else{
departname = cells_1.getStringCellValue();
}
}
}
int sk;
if(sheet.getLastRowNum()>2){//将为空的单元格与之前不为空的合并
sk=2;
for(int i=3;i<=sheet.getLastRowNum();i++){
HSSFRow rows = sheet.getRow(i);
HSSFCell cell_0 = rows.getCell(1);
if(cell_0.getStringCellValue() == ""){//如果为空但还没对比到最后一行,继续循环
if(i==sheet.getLastRowNum()){
sheet.addMergedRegion(new CellRangeAddress(sk, i, 1, 1));//如果已经对比到最后一行,开始合并
}
}else{
if(sk != i-1){//不为空且i-1不为sk则合并
sheet.addMergedRegion(new CellRangeAddress(sk, i-1, 1, 1));//起始行号,终止行号, 起始列号,终止列号
}
sk =i;
}
}
}
//上面设置好了内容,我们当然是要输出到某个文件的,输出就需要有输出流
FileOutputStream fos;
try {
fos = new FileOutputStream("d:/2010.xls");
//向指定文件写入内容
wb.write(fos);
fos.close();
return "导出Excel已完成!"; } catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} return "导出Excel失败!";
}
}

POI HSS 合并重复的列的更多相关文章

  1. ASP.NET中重复表格列合并的实现方法(转自脚本之家)

    这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就总结了一下.NET控件GridView 和 Repeater 关于重复数据合并的方法. 这是合并之前的效果: 合并之后的效果图 ...

  2. POI Excel 合并数据相同的行

    import java.io.Serializable; /** * POI Excel报表导出,列合并实体<br> * * @author WQ * */ public class Po ...

  3. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

  4. POI 怎么设置Excel整列的CellStyle啊

    POI 怎么设置Excel整列的CellStyle啊,而不是循环每个Cell.因为现在是生成Excel模板,不知道客户会输入多少行. 问题补充: 指尖言 写道 好像没有这个方法,CellStyle是C ...

  5. poi获取合并单元格内的第一行第一列的值

    当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格 其它在合并单元格区域内的单元格不显示 示例代码如下: import java.io.FileInputStream; impo ...

  6. Java导出Excel表,POI 实现合并单元格以及列自适应宽度(转载)

    POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...

  7. POI 实现合并单元格以及列自适应宽度

    POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...

  8. POI 简单合并单元格

    public class MergedCells { /** 测试使用的POI版本是3.1 * @param args */ public static void main(String[] args ...

  9. poi excel 合并单元格

    结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip,        colId, colId + c ...

随机推荐

  1. 【web前端】第一个移动端的心里体会

    公司(zyqygl)没有UI,刚开始,并没有一些具体的标准,对于字体多大,头部底部多高等一些参数,完全没有概念,按照前辈的指导(只有一个标准:做出的东西跟设计图一毛一样就对了),粗略的搭了个框架. 大 ...

  2. qbxt Day 5 图论一些基础知识

    就是一些感觉比较容易忘的知识 假设根为第0层, 在二叉树的i层上至多有2i个结点,整颗二叉树(深度为k)最多有\(2^{k+1}-1\)个节点 对于任何一棵非空二叉树,如果叶结点个数为\(n_0\), ...

  3. 【题解】洛谷P2426删数

    链接 https://www.luogu.org/problemnew/show/P2426 念念碎 第一次接触到区间DP(瑟瑟发抖) 所以象征性地看了一下题解 这好像是一道比较基础的区间DP吧 但是 ...

  4. 初入AngularJS基础门

    作为mvvm 框架过重 不适用于性能比较高的移动端的web栈, ui组建性对复杂,不利于重用 AngularJS 构建一个CRUD ( create retrieve update delete )的 ...

  5. bitmap和drawable的相互转化以及setImageResource(),setImageDrawable(),setImageBitmap()

    从本地获取drawable图片:getResources().getDrawable(R.drawable.**) 获取bitmap:Bitmap b=BitmapFactory().decodeRe ...

  6. 由inline-block小例子引申出的一些问题,及IE6、IE7兼容性解决方案

    使用场景分析: 常见的对块与块之间的横向排列处理 对同级所有元素使用display:inline-block; , 之后块与块直接会产生间隙问题 解决办法: 给父级设 font-size:0; 别高兴 ...

  7. 菜鸟崛起 DB Chapter 3 MySQL 5.6的基本操作

    3   MySQL的基本操作 上面我们学习一如何安装数据库,那么这节我们来认识一下数据库: 我们在MySQL安装后,在data目录下会自动生成几个必须的数据库,可以使用SHOW DATABASES语句 ...

  8. 买手机时几GB+几GB啥意思

    48GB 就是你每次下载手机软件呀.浏览图片呀.这些东西都放在48G里.你每次查看手机内存,就会看到你的48G用了多少.但是你什么时候看到你的4GB用了多少,都是那些360加速球呀提示你手机内存占用过 ...

  9. react中图片校验码实现以及new Buffer()使用方法

    图片校验码原理就是图片是后端生成的前端只是前后端传过来的数据流做些处理展示即可,先直接上核心代码图: 这里就是简单得对axios的一些默认项属性重写:最后你只需要将resolve的内容插入页面的< ...

  10. Super Reduced String

    https://www.hackerrank.com/challenges/reduced-string/problem He wants to reduce the string to its sh ...