zoukankan      html  css  js  c++  java
  • Java 导出Excel

    比较常用的实现Java导入、导出Excel的技术有两种Jakarta POIJava Excel,现在以前一种为例子做一个讲解,后一个感兴趣的可以去自己查下资料,楼主也会贴出代码,但是!没有跑过,不保证成功率···

    Jakarta POI

    首先下载poi-3.6-20091214.jar,下载地址如下:

      官方主页http://poi.apache.org/index.html

      API文档http://poi.apache.org/apidocs/index.html

    Maven 依赖:

      <!-- Pio依赖-->
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
    </dependency>

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
    </dependency>

    常用组件API

    常用组件:

    HSSFWorkbook                      excel的文档对象

    HSSFSheet                         excel的表单

    HSSFRow                           excel的行

    HSSFCell                          excel的格子单元

    HSSFFont                          excel字体

    HSSFDataFormat                    日期格式

    HSSFHeader                        sheet头

    HSSFFooter                        sheet尾(只有打印的时候才能看到效果)

    样式:

    HSSFCellStyle                       cell样式

    辅助操作包括:

    HSSFDateUtil                        日期

    HSSFPrintSetup                      打印

    HSSFErrorConstants                  错误信息表

    样式设置,以下有点多,根据自己需求自行参考

      1 //单元格合并
      2 
      3 CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
      4 
      5 //设置单元格的行高、列宽
      6 
      7 HSSFSheet sheet=wb.createSheet(); 
      8 
      9 //设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽 
     10 
     11 sheet.setDefaultRowHeightInPoints(10);
     12 
     13 //设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一 
     14 
     15 sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
     16 
     17 //单元格样式
     18 
     19 HSSFCellStyle cellStyle=wkb.createCellStyle();
     20 
     21 // 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
     22 
     23  cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
     24 
     26  cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 
     27 
     29  /*
     31   设置单元格的填充方式,以及前景颜色和背景颜色
     32   三点注意:
     35   1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
     37 
     38   2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
     40 
     41   3.前景颜色不是字体颜色。 
     44  */ 
     45  //设置填充方式(填充图案) 
     46 
     48  cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS); 
     49 
     51  //设置前景色 
     52 
     54  cellStyle.setFillForegroundColor(HSSFColor.RED.index);  
     55 
     57  //设置背景颜色 
     59 
     60  cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index); 
     61 
     63  // 设置单元格底部的边框及其样式和颜色 
     64 
     66  // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
     67 
     69  cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
     70 
     72  cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index); 
     73 
     75  //设置日期型数据的显示样式 
     76 
     78  cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
     79 
     80  //将样式应用于单元格
     81 
     82  cell.setCellStyle(cellStyle);
     83 
     84  //将样式应用到行,但有些样式只对单元格起作用,比如合并单元格的就不起作用
     85 
     86  row.setRowStyle(cellStyle);
     87 
     88  //设置字体样式
     89 
     90  HSSFWorkbook wb=new HSSFWorkbook(); 
     91 
     92  HSSFFont  fontStyle=wb.createFont(); 
     93 
     94  HSSFWorkbook wb=new HSSFWorkbook ();
     95 
     96  //设置字体各种样式
     97  
     99   fontStyle.setFontName("宋体");    
    100  
    101   //设置字体高度  
    102  
    103   fontStyle.setFontHeightInPoints((short)20);    
    104  
    105   //设置字体颜色  
    106  
    107   font.setColor(HSSFColor.BLUE.index);  
    108  
    109   //设置粗体  
    110  
    111   fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    112  
    113   //设置斜体  
    114  
    115  font.setItalic(true);  
    116  
    117  //设置下划线  
    118  
    119  font.setUnderline(HSSFFont.U_SINGLE);
    121 
    122  //字体也是单元格格式的一部分,所以从属于HSSFCellStyle  
    124  // 将字体对象赋值给单元格样式对象  
    125  
    126  cellStyle.setFont(font);  
    127  
    128  //将单元格样式应用于单元格  
    129  
    130   cell.setCellStyle(cellStyle);

    下面正式写代码

     1   public void exportSignRecord(HttpServletResponse response,
     2                           HttpServletRequest request) {
     3       // 第一步,创建一个workbook,对应一个Excel文件
     4       HSSFWorkbook wb = new HSSFWorkbook();
     5       // 第二步,在webbook中添加sheet,对应Excel文件中的sheet
     6       HSSFSheet sheet = wb.createSheet("测试");
     7    //设置行高
     8    short st = 20*20;
     9    // 设置列宽
    10    sheet.setColumnWidth(0, 25 * 256);
    11    sheet.setColumnWidth(1, 30 * 256);
    12    sheet.setColumnWidth(2, 50 * 256);
    13      // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    14      HSSFRow row = sheet.createRow((int) 0);
    15      row.setHeight(st);
    16      // 第四步,创建单元格,并设置值表头 设置表头居中
    17      HSSFCellStyle style = wb.createCellStyle();
    18    // 创建一个居中格式
    19      style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    20      //设置第一行和第二行格式为合并单元行
    21      sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
    22      sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2));
    23      //获取数据
    24      row.createCell((short) 0).setCellValue(“a”);
    25      row.createCell((short) 1).setCellValue(“b”);
    26      row.createCell((short) 2).setCellValue(“c”);28      // 将文件输出
    29       try {
    30           ExcelUtil.exportExcel("监控变量报表", wb, response,request);
    31       } catch (IOException e) {
    32           e.printStackTrace();
    33       }
    34   }
    35 
    36 
    37 //ExcelUtil的工具类
    39 public static void exportExcel(String name, HSSFWorkbook workbook, HttpServletResponse response, HttpServletRequest request)throws IOException{
    42 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 43 // 使用时间戳作为表格名称 44 String fileName = name + df.format(new Date()) + ".xls"; 47 String finalFileName = null; 48 final String userAgent = request.getHeader("USER-AGENT"); 49 // 设置http头 50 if(null != userAgent && -1 != userAgent.indexOf("MSIE") || null != userAgent 51 && -1 != userAgent.indexOf("Trident")){//IE浏览器 52 finalFileName = java.net.URLEncoder.encode(fileName,"UTF8"); 53 }else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器 54 finalFileName = new String(fileName.getBytes(), "ISO8859-1"); 55 }else{ 56 finalFileName = java.net.URLEncoder.encode(fileName,"UTF8");//其他浏览器 57 } 58 response.setCharacterEncoding("utf-8"); 59 response.setContentType("application/vnd.ms-excel"); 60 response.setHeader("Content-Disposition", "attachment;fileName=" + finalFileName); 61 62 // out出文件流 63 OutputStream os = response.getOutputStream(); 64 65 // 输出excel 66 workbook.write(os); // 关闭io流 67 os.close(); 68 }

    唯一要注意的就是win10自带的那个edge浏览器导出Excel的时候,导出文件名会乱码,楼主在网上找了很多资料都说要设置下浏览器,代码怎么解决没找到,谁找到了告诉我下!帅帅~或者实在不行就直接不要中文

    Java Excel(再次申明,以下内容我没有跑过,绝对不负责!大致看了下感觉不靠谱~~   = = 写代码重要的是思路!!

    Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。

    这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

    在线帮助文档http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html

      1     //获得输出流,该输出流的输出介质是客户端浏览器  
      2       
      3       OutputStream output=response.getOutputStream();  
      4       
      5       response.reset();  
      6       
      7       response.setHeader("Content-disposition","attachment;filename=temp.xls");  
      8       
      9       response.setContentType("application/msexcel");  
     10       
     11       //创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户端浏览  
     12       
     13       WritableWorkbook wk=Workbook.createWorkbook(output);  
     14       
     15       
     16      //创建可写入的Excel工作表  
     17       
     18       WritableSheet sheet=wk.createSheet("测试表", 0);  
     19       
     20      //把单元格(column, row)到单元格(column1, row1)进行合并。  
     21       
     22      //mergeCells(column, row, column1, row1);  
     23       
     24      sheet.mergeCells(0,0, 4,0);//单元格合并方法  
     25       
     26     //创建WritableFont 字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、亮蓝色  
     27       
     28     WritableFont titleFont=new WritableFont(WritableFont.createFont("黑体"),12,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.LIGHT_BLUE);  
     29       
     30     //创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式  
     31       
     32     WritableCellFormat titleFormat=new WritableCellFormat();  
     33       
     34     //设置字体格式  
     35       
     36     titleFormat.setFont(titleFont);  
     37       
     38     //设置文本水平居中对齐  
     39       
     40     titleFormat.setAlignment(Alignment.CENTRE);  
     41       
     42     //设置文本垂直居中对齐  
     43       
     44     titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);  
     45       
     46     //设置背景颜色  
     47       
     48     titleFormat.setBackground(Colour.GRAY_25);  
     49       
     50     //设置自动换行  
     51       
     52     titleFormat.setWrap(true);  
     53       
     54     //添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式  
     55       
     56     Label lab_00=new Label(0,0,"测试",titleFormat);  
     57       
     58     //将定义好的Label对象添加到工作表上,应用了titleFormat定义的样式  
     59       
     60     sheet.addCell(lab_00);  
     61       
     62     WritableCellFormat cloumnTitleFormat=new WritableCellFormat();  
     63       
     64     cloumnTitleFormat.setFont(new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.BOLD,false));  
     65       
     66     cloumnTitleFormat.setAlignment(Alignment.CENTRE);  
     67       
     68     Label lab_01=new Label(0,1,"a",cloumnTitleFormat);  
     69       
     70     Label lab_11=new Label(1,1,"b",cloumnTitleFormat);  
     71       
     72     Label lab_21=new Label(2,1,"c",cloumnTitleFormat);  
     73       
     74     Label lab_31=new Label(3,1,"d",cloumnTitleFormat);  
     75       
     76     Label lab_41=new Label(4,1,"e",cloumnTitleFormat);  
     77       
     78       sheet.addCell(lab_01);  
     79       
     80       sheet.addCell(lab_11);  
     81       
     82       sheet.addCell(lab_21);  
     83       
     84       sheet.addCell(lab_31);  
     85       
     86       sheet.addCell(lab_41);  
     87       
     88       sheet.addCell(new Label(0,2,"李明"));  
     89       
     90       sheet.addCell(new Label(1,2,"As178"));  
     91       
     92     //定义数字格式  
     93       
     94     NumberFormat nf=new NumberFormat("0.00");  
     95       
     96     WritableCellFormat wcf=new WritableCellFormat(nf);  
     97       
     98     //类似于Label对象,区别Label表示文本数据,Number表示数值型数据  
     99       
    100     Number numlab_22=new Number(2,2,78,wcf);  
    101       
    102     sheet.addCell(numlab_22);  
    103       
    104     sheet.addCell(newNumber(3,2,87,new WritableCellFormat(new NumberFormat("#.##") )));  
    105       
    106     //定义日期格式  
    107       
    108     DateFormat df=new DateFormat("yyyy-MM-dd hh:mm:ss");  
    109       
    110     //创建WritableCellFormat对象  
    111       
    112     WritableCellFormat datewcf=new WritableCellFormat(df);  
    113       
    114     //类似于Label对象,区别Label表示文本数据,DateTime表示日期型数据  
    115       
    116     DateTime dtLab_42=new DateTime(4,2,new Date(),datewcf);  
    117       
    118     sheet.addCell(dtLab_42);     
    119       
    120     //将定义的工作表输出到之前指定的介质中(这里是客户端浏览器)  
    121       
    122     wk.write();  
    123       
    124     //操作完成时,关闭对象,释放占用的内存空间     
    125       
    126     wk.close();  
    127 //加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。
         //该代码表示将temp.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,下载到客户端本地(保存或直接打开)。若要直接输出到磁盘文件可采用下列代码替换加下划线这部分代码
    128 File file=new File("D://temp.xls"); 129 WritableWorkbook wwb = Workbook.createWorkbook(file);

    从Excel文件读取数据表

     1     public List<ScoreInfo> loadScoreInfo(String xlsPath) throws IOException, BiffException{  
     2       
     3     //导入已存在的Excel文件,获得只读的工作薄对象  
     4       FileInputStream fis=new FileInputStream(xlsPath);  
     5       Workbook wk=Workbook.getWorkbook(fis);  
     6     //获取第一张Sheet表   
     7       Sheet sheet=wk.getSheet(0);  
     8     //获取总行数  
     9      int rowNum=sheet.getRows();  
    10     //从数据行开始迭代每一行  
    11       for(int i=2;i<rowNum;i++){  
    12      ScoreInfo info=new ScoreInfo();          
    13     //getCell(column,row),表示取得指定列指定行的单元格(Cell)  
    14     //getContents()获取单元格的内容,返回字符串数据。适用于字符型数据的单元格  
    15     //使用实体类封装单元格数据  
    16     info.setStuName(sheet.getCell(0, i).getContents());  
    17     info.setClassName(sheet.getCell(1, i).getContents());  
    18     //判断单元格的类型,单元格主要类型LABEL、NUMBER、DATE                    
        if(sheet.getCell(2,i).getType==CellType.NUMBER){
    20 //转化为数值型单元格 21 NumberCell numCell=(NumberCell)sheet.getCell(2,i); 22 //NumberCell的getValue()方法取得单元格的数值型数据 23 info.setRscore(numCell.getValue()); 25 } 26 if(sheet.getCell(3,i).getType==CellType.NUMBER){ 27 NumberCell numCell=(NumberCell)sheet.getCell(3,i); 28 info.setRscore(numCell.getValue); 29 } 31 if(sheet.getCell(4,i).getType==CellType.DATE){ 32 DateCell dateCell=(DateCell)sheet.getCell(4,i); 33 //DateCell的getDate()方法取得单元格的日期型数据 34 info.setDate(dateCell.getDate()); 35 } 36 } 37 fis.close(); 38 wk.close(); 39 }
  • 相关阅读:
    【转】高级爬虫
    python-基于遗传算法的多三角形拟合图像实例
    python-文件处理
    python-函数式编程与内置函数
    Python-变量、函数及递归
    Python-字符串的拼接与函数
    Python-集合
    Python-列表、元组、字典
    Python-字符串2
    Python-字符串
  • 原文地址:https://www.cnblogs.com/hzzjj/p/7265601.html
Copyright © 2011-2022 走看看