因为java的通用性,被抓去搞了几天后台,最近要弄一个excel导出,于是就想到了apache提供的poi工具,于是去http://poi.apache.org/找找,因为自己的是maven项目,所以就加个依赖引入一下包,其它的可以去下载jar放到自己仓库里面然后依赖或者直接放入项目的libs中,

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>3.8</version>
  </dependency>

接着就是api的调用了,先明确excel是怎么组成的,最外层是一个xls文件,然后打开后是各种sheet,里面再有各种索引定位的cell,

这样就可以很容易了解poi提供的几个类的意思了,


// 声明一个工作区
  HSSFWorkbook workbook = new HSSFWorkbook();
  // 生成一个sheet
  HSSFSheet sheet = workbook.createSheet("sheet的名字");
  // 接着就是用sheet去操纵row和cell去放对应的数据了
  // 几个可能用的着的类:=
  // 获取到样式style 
  HSSFCellStyle style = workbook.createCellStyle();
  // 获取到字体style
  HSSFFont font = workbook.createFont();
  style.setFont(font);

  // 声明一个画图管理器</span>
  HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  //定义excel用的注释的大小以及所处的位置
  HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 3, 1, ( short) 5, 3));

  comment.setString(new HSSFRichTextString("注释内容"));// 设置注释内容 
  comment.setAuthor("anchorname");// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.




在web与在java中将excel输出的区别就是输出流的设置

servlet中对response要做一下设置:

response.setHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8"); 
 response.addHeader("Content-Disposition", "attachment;filename=mvdata_"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+".xls");

java中就是指定fileoutputstream中file的位置就ok了


web中具体操作如下:

@SuppressWarnings("unchecked")
@RequestMapping("exportData")
public @ResponseBody void exportData(HttpServletResponse response, HttpServletRequest request) throws Exception {			
  
          Map<String, Object> result = service.getData(startIndex, pageSize);
	  String[] columnName = {"标题1", "标题2"};//表格中列名	       
	  List<List<String>> allRows =  Lists.newArrayList();//每一行的数据
	  for(Info info:list){//javabean 为Info , 里面含有2个属性为 name, age
	       List<String> infoList = Lists.newArrayList();
	       infoList.add(info.getName());
	       infoList.add(info.getAge()); 
               allRows.add(infoList);	
	  }
          response.setHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8"); 
	  response.addHeader("Content-Disposition", "attachment;filename="EXCEL的名字.xls");

          OutputStream out = response.getOutputStream();
          HSSFWorkbook wb = new HSSFWorkbook();

                    out = exportExcel(wb, "sheet1", Arrays.asList(columnNameStrs), allRows, out);//自己封装了方法,因为在util类中,所以就提出来都写在下面,具体方法如下                out.close();

}


public static OutputStream exportExcel(HSSFWorkbook wb, String sheetName, List<String> columnNames, List<List<String>> allRows, OutputStream out) throws IOException {
writeSheet(wb, sheetName, columnNames, allRows);
        wb.write(out);
        out.flush();
        return out;
}

public static void writeSheet(HSSFWorkbook wb, String sheetName, List<String> columnNames, List<List<String>> allRows) {
        HSSFSheet sheet = wb.createSheet(sheetName);
        short index = 0;
        for (String columnName : columnNames) {
            sheet.setColumnWidth(index, 6500);
            index++;
        }
        
        if(!BlankUtil.isBlank(columnNames))//判断传进来的标题是否为空
            writeColumnNames(wb, sheet, columnNames, 0);//在第一行写标题
        if(!BlankUtil.isBlank(allRows))//判断传进来的数据是否为空
            writeData(wb, sheet, allRows, 1);在第二行写数据
}

public static void writeColumnNames(HSSFWorkbook wb, HSSFSheet sheet, List<String> columnNames, int rowIndex) {

        HSSFRow row = sheet.createRow(rowIndex);//拿到row
        HSSFCellStyle headerStyle = wb.createCellStyle();//拿到style,具体style设置参看api,我这里直接用的默认的
        short index = 0;
        for (String columnName : columnNames) {
            HSSFCellUtil.createCell(row, index, columnName, headerStyle);//创建cell,并且写入内容
            index++;
        }
}

public static void writeData(HSSFWorkbook wb, HSSFSheet sheet, List<List<String>> allRows, int rowIndex) {//具体调用同上,就是从第2行开始写数据
        int rowCount = rowIndex;
        HSSFCellStyle normalStyle =wb.createCellStyle();
        for (List<String> everyRow : allRows) {
            short index = 0;
            HSSFRow row = sheet.createRow(rowCount);
            row.setHeight((short)300);
            for (String cell : everyRow) {
                HSSFCellUtil.createCell(row, index, cell, normalStyle);
                index++;
            }
            rowCount++;
        }
}




好了,这样的话通过浏览器访问 http://ip:port/web.xml中配置的项目根目录/exportData  就能够导出excel出来了,具体这边不是很详细,如果需要详细的话建议大家看下官方的api吧,就这样吧