导出Excel问题,第一条数据不见了
public void exportExcel(String title, Collection<T> dataset,
OutputStream out) {
// 声明一个工作薄
try {
//首先检查数据看是否是正确的
Iterator<T> its = dataset.iterator();
if(dataset==null||!its.hasNext()||title==null||out==null)
{
throw new Exception("传入的数据不对!");
}
//取得实际泛型类
T ts = (T) its.next();
Class tCls = ts.getClass();
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置标题样式
style = ExcelStyle.setHeadStyle(workbook, style);
// 得到所有字段
Field filed[] = ts.getClass().getDeclaredFields();
// 标题
List<String> exportfieldtile = new ArrayList<String>();
// 导出的字段的get方法
List<Method> methodObj = new ArrayList<Method>();
// 遍历整个filed
for (int i = 0; i < filed.length; i++) {
Field f = filed[i];
ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
// 如果设置了annottion
if (exa != null) {
String exprot = exa.exportName();
// 添加到标题
exportfieldtile.add(exprot);
// 添加到需要导出的字段的方法
String fieldname = f.getName();
String getMethodName = "get"
+ fieldname.substring(0, 1).toUpperCase()
+ fieldname.substring(1);
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
methodObj.add(getMethod);
}
}
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < exportfieldtile.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(
exportfieldtile.get(i));
cell.setCellValue(text);
}
int index = 0;
// 循环整个集合
while (its.hasNext()) {
//从第二行开始写,第一行是标题
index++;
row = sheet.createRow(index);
T t = (T) its.next();
for (int k = 0; k < methodObj.size(); k++) {
HSSFCell cell = row.createCell(k);
Method getMethod=methodObj.get(k);
Object value = getMethod.invoke(t, new Object[] {});
String textValue = getValue(value);
cell.setCellValue(textValue);
}
}
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
数据库数据:
1kkadingtf@123.comM2010-10-24 16:30:28
2张三azhangs@123.comF2010-10-24 16:37:33
3李四awangsu@123.comM2010-10-24 16:52:03
4王五awangsu@123.comF2010-10-24 16:57:04
5刘柳awangsu@123.comM2010-10-24 17:00:13
6张峰awangsu@123.comM2010-10-24 17:03:12
7王琦awangsu@123.comM2010-10-24 17:08:35
8等待awangsu@123.comF2010-10-24 17:10:33
9芦娟awangsu@123.comF2010-10-24 17:14:29
10法则awangsu@123.comF2010-10-24 17:15:59
导出数据:
2张三azhangs@123.comF2010-10-24 16:37:33
3李四awangsu@123.comM2010-10-24 16:52:03
4王五awangsu@123.comF2010-10-24 16:57:04
5刘柳awangsu@123.comM2010-10-24 17:00:13
6张峰awangsu@123.comM2010-10-24 17:03:12
7王琦awangsu@123.comM2010-10-24 17:08:35
8等待awangsu@123.comF2010-10-24 17:10:33
9芦娟awangsu@123.comF2010-10-24 17:14:29
10法则awangsu@123.comF2010-10-24 17:15:59
[解决办法]
你那里注释的不是从第二行开始,这样导致了第一行被标题覆盖,所以他就不出来
[解决办法]
调试,看从哪里最先开始不见的
[解决办法]
private HSSFWorkbook workbook=null;
private void exportExcel(ActionContext ctx) throws Exception{
HttpServletRequest request=(HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
String[] titles=(String[])request.getAttribute("titles");
List dataList=(List)request.getAttribute("shopList");
workbook=new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet("sheet1");
if(dataList!=null){
HSSFRow titleRow=sheet.createRow(0);
for(int i=0;i<titles.length;i++){
HSSFCell cell=titleRow.createCell((short)i);
cell.setCellValue(titles[i]);
}
//填充表格
for(int i=0;i<dataList.size();i++){
HSSFRow dataRow=sheet.createRow(i+1);
Object obj=dataList.get(i);
Method[] methods=obj.getClass().getMethods();
int j=0;
for(Method method:methods){
if(method.getName().startsWith("get")&&!method.getName().equals("getClass")){
HSSFCell cell=dataRow.createCell((short)j++);
Object value=method.invoke(obj);
cell.setCellValue(value.toString());
}
}
}
}
}
@Override
protected void doExecute(String arg0, ActionInvocation invocation)
throws Exception {
//获取到ActionContext的实例
ActionContext ctx=invocation.getInvocationContext();
//通过ActionContext对象获取到response
HttpServletResponse response=(HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
//获取到outputStream实例,用于将excel输出到流中
OutputStream out=response.getOutputStream();
//设置响应头与内容
response.setHeader("Content-disposition", "attachment;filename=SCCE.xls");
response.setContentType("application/msexcel;charset=gbk");
exportExcel(ctx);
workbook.write(out);
out.flush();
out.close();
}
[解决办法]
T t = (T) its.next(); 被你执行了两次。。才开始取数据。。。已经滑到第二行了。。。
[解决办法]
你把index++ 放到row = sheet.createRow(index); 后面去看看
[解决办法]
row = sheet.createRow(row.getLastNum());
HSSFRow有获取最后一行行数的方法呢,具体你查查。
[解决办法]