java用POI写Excel按列写入数据
我们都知道poi较为方便的的写入方法是按行写入数据,但是如果需要合并单元格的话比较好的办法是按列写入数。下面我介绍一种从pojo类中取出数据并按列写入的方式。
需要注意的是,第二次获取行对象时应该使用get方法,而不是create,如果一直使用create()会导致前一行输入的数据消失,最后变成只生成了最后一行的数据
// 获取每行参数
HSSFRow row = null;
HSSFCell cell = null;
CellRangeAddress region = null;
// 获取每列标题和对应的属性方法
String[] tittle = {"企业名称", "主管区领导", "服务包派发时间", "服务管家", "服务管家联系人", "服务管家联系方式", "属地服务生", "属地联系人",
"属地联系方式", "服务包类别", "企业联系人", "企业联系方式", "企业基本情况", "诉求类型", "诉求详情", "专项服务措施", "诉求是否办结",
"属地服务生回访信息", "企业意见", "企业满意度", "承办单位", "预计办结时间", "进展情况", "反馈时间", "是否办结", "备注"};
String[] methods = {"getComName", "getLeader", "getPackTime", "getServicer", "getServicePerson", "getServicePhone",
"getPossessionService", "getPossessionPerson", "getPossessionPhone", "getPackType", "getComPerson", "getComPhone",
"getComDesc", "getAppealType", "getAppealDesc", "getMeasure", "getAppealStatus", "getVisit", "getComSuggest",
"getComStatus", "getDept", "getPredictTime", "getCondition", "getFeedbackTime", "getManageStatus", "getRemark"};
// 缓存一个字符串
String strTemp = null;
// 记录从第几行开始相等
int temp = 0;
int i = 0;
// 外层循环次数为列的个数
// for(int i = 0; i < tittle.length; i++){
// 判断是否为第一个,如果是第一次就创建一列,如果不是就直接获取一列
if(i == 0){
row = sheet.createRow(0);
}else{
row = sheet.getRow(0);
}
// 设置每列标题
cell = row.createCell(i);
cell.setCellValue(tittle[i]);
// 内层循环行数,也是就数据的总数
for(int j = 0;j < list.size();j++){
// 同样判断是否为第一个,如果是第一次就创建一列,如果不是就直接获取一列
if(i == 0){
row = sheet.createRow(j+1);
}else{
row = sheet.getRow(j+1);
}
// 获取此次的bean
ExcelPoiBean exbean= list.get(j);
cell = row.createCell(i);
// 通过反射获取此字段的给方法
String str = String.valueOf(exbean.getClass().getMethod(methods[i]).invoke(exbean));
// 进行合并单元格的判断
if(j == 0){
strTemp = str;
}else{
if(!strTemp.equals(str)){
region = new CellRangeAddress(temp, j-1, i, i);
sheet.addMergedRegion(region);
strTemp = str;
temp = j;
}
}
// 置入数据
cell.setCellValue(str);
}
// }