Java 导出Excel实例代码整理(POI) 可用

来源:互联网 发布:tensorflow车道线识别 编辑:程序博客网 时间:2024/06/05 15:19

        两年前曾实现做过导出excel表格,由于当年缺少一种代码积累意识,于是乎跟很多人一样代码实现后就给弃之九霄,凑巧如今又使用了这么一个功能,等于又重新开始了一段初学的历程.  声明:以下代码均是小弟参考其他大神资料整理而来。建议阅读时根据先后顺序

附上导出结果:




一、Java实现Excel导出的方式有哪些

目前常见读写Excel的工具类开源javaAPI有两种方式,
一个是JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/
一个是Apache的POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/

由于我是使用的POI,所以这里较为注重POI导出资料的整理,另鉴于轮组不要胡乱造,况且新造的轮子不一定有旧的好,故此处搬出自己学习的技术博客出处
  • java中导入、导出execl   http://blog.csdn.net/jerehedu/article/details/45195359
注:很简单明了的一个教程,可以让你简单快速的进行代码开发等。
  • java读写execl之POI超入门  http://rensanning.iteye.com/blog/1538591
注:此为详细篇,基本常用的都已包含. 基础execl格式以满足.
  • poi中常用的api  http://blog.csdn.net/u011182715/article/details/51473618
注:一些api的补充.

以上三篇,可以说包含了大部分的poi资料.  一般情况下够用,至少我就是参考以上例子完成酱.

二、代码功能实现

  铺垫了酱么多,说白了还是一样一样的,这里就简单附上一下个人代码的实现,首先肯定了先要加jar包,插件嘛,少了关键点怎么行呢,就比如咱们去大保健,钱都没带那不是迟早要粗事吖~

1.加入jar包.

自己下载自己加    http://download.csdn.net/detail/dcb_ripple/9790774

2.main代码实现

package jakarta;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.hssf.usermodel.HSSFAnchor;import org.apache.poi.hssf.usermodel.HSSFCell;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.ss.util.CellRangeAddress;public class JakartaTest {public static void main(String[] args) {//web对象HSSFWorkbook wb = new HSSFWorkbook();//创建表头等HSSFSheet sheet = wb.createSheet("test1");//创建行HSSFRow row = sheet.createRow(0);//创建列HSSFCell cell = row.createCell(0);HSSFCell cell2 = row.createCell(2);cell2.setCellValue("嗯哼");cell.setCellValue("我是写入的值");sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); try {FileOutputStream output = new FileOutputStream("E:\\JAKARTA.xls");wb.write(output);output.flush(); System.out.println("成功创建excel文件");} catch (Exception e) {e.printStackTrace();}}}

经测试.   运行即可完成execl创建,其实可以理解为是java 通过POI插件创建了一个EXECL文件而已.

3.通过浏览器实现导出

其实上面教程已经有讲怎么样通过控制器Controller导出

public void exportInfo(){try {String myId = getRequest().getParameter("myId");MyOrder my = endOrderService.getMyOrderMyId(myId);//订单信息List<MyOrderProductBean> mylist = endOrderService.getOrderInfos(myId); //订单产品详情if(my!=null || mylist!=null){//web对象HSSFWorkbook wb = new HSSFWorkbook();//创建表头等HSSFSheet sheet = wb.createSheet(my.getOrder_title());//省略省略/....  //以下是关键HttpServletResponse response = ServletActionContext.getResponse();response.reset(); OutputStream output = getRepsonse().getOutputStream(); response.setHeader("Content-disposition", "attachment; filename=Info.xls");      response.setContentType("application/msexcel");              wb.write(output);    output.close();  System.out.println("成功创建excel文件");}}catch (Exception e) {e.printStackTrace();}}


Struts2框架,这里是通过了输出流OutputStream完成对文件的创建,这里要避免可能出现的Exception,即输出流重复创建或者输出流与struts2方法返回冲突。

概要; http://blog.csdn.net/dcb_ripple/article/details/62422440

代码实例.

/** * 导出订单信息.* @author 邓成波* @date 创建时间 2017年3月16日 下午12:04:31 * @return */public void exportInfo(){try {String myId = getRequest().getParameter("myId");MyOrder my = endOrderService.getMyOrderMyId(myId);//订单信息List<MyOrderProductBean> mylist = endOrderService.getOrderInfos(myId); //订单产品详情if(my!=null || mylist!=null){//web对象HSSFWorkbook wb = new HSSFWorkbook();//创建表头等HSSFSheet sheet = wb.createSheet(my.getOrder_title());// 用于格式化单元格的数据        HSSFDataFormat format = wb.createDataFormat();        // 设置字体 (上方标题用 填写内容)        HSSFFont font = wb.createFont();        font.setFontHeightInPoints((short) 11); //字体高度        font.setColor(HSSFFont.COLOR_NORMAL); //字体颜色        font.setFontName("宋体"); //字体                //表头主数据,加粗        HSSFCellStyle cellStyle = wb.createCellStyle();        cellStyle.setFont(font);        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中        cellStyle.setWrapText(true);//换行                // 设置字体 (上方标题用 导航头加粗)        HSSFFont fontBold = wb.createFont();        fontBold.setFontHeightInPoints((short) 11); //字体高度        //setHSSFPalette("#3366FF",7,wb);//自定义设置字体颜色        fontBold.setColor(HSSFFont.COLOR_NORMAL); //字体颜色        fontBold.setFontName("宋体"); //字体        fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);                  // 设置单元格类型        HSSFCellStyle cellStyleBold = wb.createCellStyle();        cellStyleBold.setFont(fontBold);        cellStyleBold.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中        cellStyleBold.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中        cellStyleBold.setWrapText(true);//换行                ArrayList<String[]> list = new ArrayList<String[]>();        //rowNmae名称        String[] rowsName1 = new String[]{"合同流水号:","","机构:",""+my.getCompany()+"",   "客户名称:",""+my.getClient_name()+"","出货批次:",""+my.getBatch()+""};          String[] rowsName2 = new String[]{"合同号:","","负责人:",""+my.getPrincipal()+"",   "项目名称:",""+my.getProject_name()+"","收货人:",""+my.getReceipt_name()+""};          list.add(rowsName1);        list.add(rowsName2);        String[] rowsName3 = new String[]{"erp编号","产品名称","型号","识别号","颜色","数量","合同单价","金额小计"};          list.add(rowsName3);        sheet.setDefaultColumnWidth(15);//设置列默认的宽度        //sheet.setDefaultRowHeight((short) 1.5); //设置默认列高度        for (int i = 0; i < list.size(); i++) {        HSSFRow row = null;        if(i==2){        row = sheet.createRow(3);        }else{        row = sheet.createRow(i);        }        row.setHeightInPoints(17);//设置字体大小        String[] rowsName = list.get(i);for(int c = 0;c<rowsName.length;c++){HSSFCell cell = row.createCell(c);cell.setCellValue(rowsName[c]);if(i==2){        cell.setCellStyle(getStyleTitle(wb));}else{if(c%2==0){cell.setCellStyle(cellStyleBold);}else{cell.setCellStyle(cellStyle);}}}}        sheet.setColumnWidth((short) 1, (short)(256*20)); //设置行宽度        sheet.setColumnWidth((short) 2, (short)(256*20)); //设置行宽度        //==================表头信息 结束=========================        List<Object[]>  dataList = new ArrayList<Object[]>();          Object[] objs = null;          for (int i = 0; i < mylist.size(); i++) {          MyOrderProductBean mybean = mylist.get(i);              objs = new Object[rowsName3.length];              objs[0] = mybean.getProduct_id(); //erp编号            objs[1] = mybean.getSort_Name();  //产品名称            objs[2] = mybean.getTypeName();   //产品类型名称              objs[3] = mybean.getIdentify();   //识别号 id              objs[4] = mybean.getColor();    //颜色            objs[5] = mybean.getCount();    //数量            objs[6] = mybean.getClinch_money();    //合同单价            objs[7] = mybean.getClinch_money_sum();    //金额小计            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");              //String date = df.format(man.getModiDate());              dataList.add(objs);          }                for(int i = 0; i < dataList.size(); i++) {        HSSFRow row =sheet.createRow(i+4);        Object[] objsRow = dataList.get(i);        int length = 0;        for (int j = 0; j < objsRow.length; j++) {HSSFCell cell = row.createCell(j);if(objsRow[j]!=null && !objsRow[j].toString().isEmpty()){if(objsRow[j].toString().length()>length){//获取本列最高的字符长度length =  objsRow[j].toString().length();}cell.setCellValue(objsRow[j].toString());}cell.setCellStyle(getStyle(wb));}        //某列字数太多换行  暂时不要        /*if(length>9){        row.setHeight((short)((length%9)*265)); //这里的265代表一个字的高度        }*/}        //价格合计及说明.        HSSFRow row =sheet.createRow(dataList.size()+4);        HSSFCell cell = row.createCell(0);        cell.setCellStyle(getStyle(wb));        HSSFCell cell2 = row.createCell(1);        cell2.setCellValue("合计:");        cell2.setCellStyle(getStyle(wb));        row.createCell(2).setCellStyle(getStyle(wb));        row.createCell(3).setCellStyle(getStyle(wb));        row.createCell(4).setCellStyle(getStyle(wb));        row.createCell(5).setCellStyle(getStyle(wb));        row.createCell(6).setCellStyle(getStyle(wb));        HSSFCell cell3 = row.createCell(7);        cell3.setCellValue(my.getTotal_money());        cell3.setCellStyle(getStyleTitle(wb));        sheet.addMergedRegion(new CellRangeAddress(dataList.size()+4,dataList.size()+4,1,6));        // 表格说明列        HSSFRow rowContext =sheet.createRow(dataList.size()+5);        HSSFCell cellContext = rowContext.createCell(0);        cellContext.setCellValue("说明:");        cellContext.setCellStyle(getStyle(wb));        HSSFCell cellContext2 = rowContext.createCell(1);        cellContext2.setCellValue(my.getOrder_desc());        cellContext2.setCellStyle(getStyle(wb));        rowContext.createCell(2).setCellStyle(getStyle(wb));        rowContext.createCell(3).setCellStyle(getStyle(wb));        rowContext.createCell(4).setCellStyle(getStyle(wb));        rowContext.createCell(5).setCellStyle(getStyle(wb));        rowContext.createCell(6).setCellStyle(getStyle(wb));        rowContext.createCell(7).setCellStyle(getStyle(wb));        sheet.addMergedRegion(new CellRangeAddress(dataList.size()+5,dataList.size()+5,1,7));               sheet.autoSizeColumn((short)0); //调整第一列宽度        sheet.autoSizeColumn((short)1); //调整第二列宽度        sheet.autoSizeColumn((short)2);         sheet.autoSizeColumn((short)3);        sheet.autoSizeColumn((short)4);         sheet.autoSizeColumn((short)5);        sheet.autoSizeColumn((short)6);         sheet.autoSizeColumn((short)7);//sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));  //合并列HttpServletResponse response = ServletActionContext.getResponse();response.reset(); OutputStream output = getRepsonse().getOutputStream(); response.setHeader("Content-disposition", "attachment; filename=Info.xls");      response.setContentType("application/msexcel");              wb.write(output);    output.close();  System.out.println("成功创建excel文件");}}catch (Exception e) {e.printStackTrace();}}/**   * 列表数据格式* @author 邓成波* @date 创建时间 2017年3月21日 下午4:32:13 * @param workbook* @return*/    public HSSFCellStyle getStyle(HSSFWorkbook workbook) {            // 设置字体            HSSFFont font = workbook.createFont();            //设置字体名字            font.setFontName("宋体"); //字体          //设置字体大小            font.setFontHeightInPoints((short)11);            //字体加粗            //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);            //设置样式;             HSSFCellStyle style = workbook.createCellStyle();            //设置底边框;             style.setBorderBottom(HSSFCellStyle.BORDER_THIN);            //设置底边框颜色;              style.setBottomBorderColor(HSSFColor.BLACK.index);            //设置左边框;               style.setBorderLeft(HSSFCellStyle.BORDER_THIN);            //设置左边框颜色;             style.setLeftBorderColor(HSSFColor.BLACK.index);            //设置右边框;             style.setBorderRight(HSSFCellStyle.BORDER_THIN);            //设置右边框颜色;             style.setRightBorderColor(HSSFColor.BLACK.index);            //设置顶边框;             style.setBorderTop(HSSFCellStyle.BORDER_THIN);            //设置顶边框颜色;              style.setTopBorderColor(HSSFColor.BLACK.index);            //在样式用应用设置的字体;              style.setFont(font);            //设置自动换行;          style.setWrapText(true);            //设置水平对齐的样式为居中对齐;              style.setAlignment(HSSFCellStyle.ALIGN_CENTER);            //设置垂直对齐的样式为居中对齐;             style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);            return style;  }      /*** 列表表头用   数据格式表头* @author 邓成波* @date 创建时间 2017年3月21日下午4:32:13* @param workbook* @return*/    public HSSFCellStyle getStyleTitle(HSSFWorkbook workbook) {              //设置字体            HSSFFont font = workbook.createFont();            //设置字体名字            font.setFontName("宋体"); //字体          //设置字体大小            font.setFontHeightInPoints((short)10);            //字体加粗            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);            //设置样式;             HSSFCellStyle style = workbook.createCellStyle();                      style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);           style.setFillForegroundColor(IndexedColors.RED.getIndex());            style.setFillBackgroundColor(IndexedColors.RED.getIndex());                      //设置底边框;             style.setBorderBottom(HSSFCellStyle.BORDER_THIN);            //设置底边框颜色;              style.setBottomBorderColor(HSSFColor.BLACK.index);            //设置左边框;          style.setBorderLeft(HSSFCellStyle.BORDER_THIN);            //设置左边框颜色;             style.setLeftBorderColor(HSSFColor.BLACK.index);            //设置右边框;             style.setBorderRight(HSSFCellStyle.BORDER_THIN);            //设置右边框颜色;             style.setRightBorderColor(HSSFColor.BLACK.index);            //设置顶边框;             style.setBorderTop(HSSFCellStyle.BORDER_THIN);            //设置顶边框颜色;              style.setTopBorderColor(HSSFColor.BLACK.index);            //在样式用应用设置的字体;              style.setFont(font);            //设置自动换行;             style.setWrapText(false);            //设置水平对齐的样式为居中对齐;              style.setAlignment(HSSFCellStyle.ALIGN_CENTER);            //设置垂直对齐的样式为居中对齐;             style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);            return style;  }      /** * 设定自定义字体颜色信息* @author 邓成波* @date 创建时间 2017年3月21日 下午12:01:09 * @param str 颜色* @param index 编号* @param wb execl对象 */public void setHSSFPalette(String str,int index,HSSFWorkbook wb){  //处理把它转换成十六进制并放入一个数   int[] color=new int[3];   color[0]=Integer.parseInt(str.substring(1, 3), 16);   color[1]=Integer.parseInt(str.substring(3, 5), 16);  color[2]=Integer.parseInt(str.substring(5, 7), 16);   //自定义颜色   HSSFPalette palette = wb.getCustomPalette();   //设置自定义颜色的下标,接下来会用到  palette.setColorAtIndex(((short) index),(byte)color[0], (byte)color[1], (byte)color[2]);} 


附加:导出表名中文乱码问题,从别处找到可用. 

 response.setHeader("Content-disposition", "attachment; filename=中文名称.xls");        //response.setContentType("application/msexcel");        response.setContentType("application/x-download");//下面三行是关键代码,处理乱码问题          response.setCharacterEncoding("utf-8");          response.setHeader("Content-Disposition", "attachment;filename="+new String(my.getOrder_title().getBytes("gbk"), "iso8859-1")+".xls");  

代码有点乱,由于格式问题,比较臃肿,仅能做参考那种。至于为什么要这么用上面的三个已经介绍的比较详细》

一. POI设置自定义的字体颜色等,经测试可行,代码中未使用 注释掉了。

  1. poi怎么使用自定义字体颜色  http://www.iteye.com/problems/42620
  2. poi设置颜色和自定义颜色  http://blog.sina.com.cn/s/blog_b0d90e8c0102v3op.html
  3. 颜色索引对照表  http://blog.csdn.net/for_china2012/article/details/29844661

二.调整行宽及自适应及数据转

  1. execl自动调整列宽  http://www.cnblogs.com/azhqiang/p/4111197.html
  2. 行高设置   http://blog.csdn.net/chinapi_hzh/article/details/5776119
  3. 公共导出execl的方法  http://blog.csdn.net/wangchangpen62/article/details/44410967

完。


 嗯哼》》  不会告诉你这么点东西,整理下来弄一弄居然花了一个多小时.  宝宝心里苦














0 0