java之poi操作excel-基本的excel读写操作

java之poi操作excel-基本的excel读写操作

     接下来介绍一下采用java操作excel的第三方框架:poi,对于poi,我想搞过批量导入、导出数据的博友都应该熟悉(当然啦,批量导入导出excel数据还有jxl,这里我就不介绍了!)。poi是apache jakarta项目的子项目,主要的用途在于提供一组用于操作windows 文档的java api,如操作word,excel,powerpoint等,详细介绍诸位博友可以看看其他的网络介绍。

    本篇博文将介绍一下采用poi读写excel,为后续介绍的批量导入、导出excel数据做铺垫!

    工欲善其事,必先利其器。首先,需要poi的Jar包,就一个而已,可以到官网下,也可以来我这里:poi操作excel需要的jar  ,除此之外,就是需要对excel的基本一些知识需要有所了解,如sheet,row,cell等概念。最后需要明确一点:先有excel文件(工作簿),再有sheet,再有row,最后才有cell,明确了这一点,其实在操作excel上已经迈出了第一步!

    废话不多说,直接上代码吧,代码中我已经有所注释,如果需要扩展功能,可以去查看poi的相关api,或者去网上下载一些pdf、word文档来瞧瞧。我找了一篇,没全看完,但是觉得还行,可以来我这里下载:java之poi操作excel实战文档

    下面是我建立的jar project的总体图:这里,我只介绍ExcelRead和ExcelWrite,即excel读写操作。



    下面是ExcelWrite:

[java]  view plain  copy
  1. package com.poi.second;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.util.Date;  
  5.   
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  8. import org.apache.poi.hssf.usermodel.HSSFDataFormat;  
  9. import org.apache.poi.hssf.usermodel.HSSFRow;  
  10. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  12. import org.apache.poi.ss.usermodel.CreationHelper;  
  13.   
  14. /** 
  15.  * 写excel 
  16.  * @author 钟林森 
  17.  * 
  18.  */  
  19. public class ExcelWrite {  
  20.     public static void main(String[] args) throws Exception{  
  21.           
  22.         //创建一个工作簿 即excel文件,再在该文件中创建一个sheet  
  23.         HSSFWorkbook wb=new HSSFWorkbook();  
  24.         HSSFSheet sheet=wb.createSheet("第一个sheet");  
  25.           
  26.         //在sheet中创建一行  
  27.         HSSFRow row=sheet.createRow(0);  
  28.           
  29.         //在该行写入各种类型的数据  
  30.         row.createCell(0).setCellValue(true);  
  31.         row.createCell(1).setCellValue("钟林森");  
  32.         row.createCell(2).setCellValue(23);  
  33.           
  34.         //设置保留两位小数  
  35.         HSSFCell cell=row.createCell(3);  
  36.             cell.setCellValue(6000);  
  37.                 HSSFCellStyle cellStyle = wb.createCellStyle();  
  38.                 cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));  
  39.                 cell.setCellStyle(cellStyle);  
  40.           
  41.         //在写入 日期格式的 数据需要进行特殊处理(这是一种 简单的处理方式)  
  42.         CreationHelper createHelper=wb.getCreationHelper();  
  43.         HSSFCellStyle style=wb.createCellStyle();  
  44.         style.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd"));  
  45.           
  46.         cell=row.createCell(4);  
  47.         cell.setCellValue(new Date());  
  48.         cell.setCellStyle(style);  
  49.           
  50.         //最后写回磁盘  
  51.         FileOutputStream out=new FileOutputStream("E:\\java_BasicWeb\\someFiles\\excel写数据.xls");  
  52.         wb.write(out);  
  53.         out.close();  
  54.           
  55.         System.out.println("写完了!");  
  56.     }  
  57. }  

    我们看写回磁盘的那个 “excel写数据.xls”文件:



    打开来看一下:成功写入



   接下来,我们来读取excel文件,刚刚写入的那个磁盘的“excel读数据.xls”,打开先来看一下:


   我们目的是读取这两行数据,放到控制台来瞧瞧(其实也可以写到数据库或者另外一个excel文件中: 然后你会发现其实这就是 批量导入、导出的雏形大笑


   上代码ExcelRead:

[java]  view plain  copy
  1. package com.poi.second;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.InputStream;  
  5. import java.text.SimpleDateFormat;  
  6.   
  7. import org.apache.poi.hssf.usermodel.HSSFCell;  
  8. import org.apache.poi.hssf.usermodel.HSSFDateUtil;  
  9. import org.apache.poi.hssf.usermodel.HSSFRow;  
  10. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  12. import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
  13.   
  14. /** 
  15.  * 读excel 
  16.  * @author 钟林森 
  17.  * 
  18.  */  
  19. public class ExcelRead {  
  20.     public static void main(String[] args) throws Exception {  
  21.   
  22.         //读取一个excel表的内容  
  23.         InputStream stream = new FileInputStream("E:\\java_BasicWeb\\someFiles\\excel读数据.xls");  
  24.         POIFSFileSystem fs = new POIFSFileSystem(stream);  
  25.         HSSFWorkbook wb = new HSSFWorkbook(fs);  
  26.   
  27.         //获取excel表的第一个sheet  
  28.         HSSFSheet sheet = wb.getSheetAt(0);  
  29.         if (sheet == null) {  
  30.             return;  
  31.         }  
  32.   
  33.         //遍历该sheet的行  
  34.         for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {  
  35.             HSSFRow row = sheet.getRow(rowNum);  
  36.             if (row == null) {  
  37.                 continue;  
  38.             }  
  39.   
  40.             //再遍历改行的所有列  
  41.             for(int cellNum = 0; cellNum <= row.getLastCellNum(); cellNum++) {  
  42.                 HSSFCell cell = row.getCell(cellNum);  
  43.                 if (cell == null) {  
  44.                     continue;  
  45.                 }  
  46.                   
  47.                   
  48.                 String strVal=readCellSecondMethod(cell);  
  49.                 if (cellNum==2) {  
  50.                     strVal=strVal.contains(".")?strVal.substring(0, strVal.indexOf(".")):strVal;  
  51.                 }  
  52.                 System.out.print(" " + strVal);  
  53.                   
  54.                 //System.out.print(" " + readCellFirstMethod(cell));  
  55.                 //System.out.print(" " + readCellSecondMethod(cell));  
  56.                   
  57.             }  
  58.             System.out.println();  
  59.         }  
  60.   
  61.         stream.close();  
  62.     }  
  63.   
  64.     /**第一种方法 
  65.      * 读取excel单元格的内容并针对其type进行不同的处理, 
  66.      * 其中就包含  读取excel表格中日期格式的cell 
  67.      * @param cell 
  68.      * @return 
  69.      */  
  70.     public static String readCellFirstMethod(HSSFCell cell) {  
  71.         if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {  
  72.             return String.valueOf(cell.getBooleanCellValue());  
  73.         } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {  
  74.             if (HSSFDateUtil.isCellDateFormatted(cell)) {  
  75.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  76.                 return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();  
  77.             }  
  78.             return String.valueOf(cell.getNumericCellValue());  
  79.         } else {  
  80.             return cell.getStringCellValue();  
  81.         }  
  82.     }  
  83.   
  84.     /**第二种方法 
  85.      * 读取excel单元格的内容并针对其type进行不同的处理, 
  86.      * 其中就包含  读取excel表格中日期格式的cell 
  87.      * @param cell 
  88.      * @return 
  89.      */  
  90.     public static String readCellSecondMethod(HSSFCell cell) {  
  91.         //DecimalFormat df = new DecimalFormat("#");  
  92.         if (cell == null) {  
  93.             return "";  
  94.         }  
  95.         switch (cell.getCellType()) {  
  96.           
  97.             //数字  
  98.             case HSSFCell.CELL_TYPE_NUMERIC:  
  99.                   
  100.                 //日期格式的处理  
  101.                 if (HSSFDateUtil.isCellDateFormatted(cell)) {  
  102.                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  103.                     return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();  
  104.                 }  
  105.                   
  106.                 return String.valueOf(cell.getNumericCellValue());  
  107.                 //return df.format(cell.getNumericCellValue());  
  108.                   
  109.             //字符串  
  110.             case HSSFCell.CELL_TYPE_STRING:  
  111.                 return cell.getStringCellValue();  
  112.               
  113.             //公式  
  114.             case HSSFCell.CELL_TYPE_FORMULA:  
  115.                 return cell.getCellFormula();  
  116.                   
  117.             //空白  
  118.             case HSSFCell.CELL_TYPE_BLANK:  
  119.                 return "";  
  120.               
  121.             //布尔取值  
  122.             case HSSFCell.CELL_TYPE_BOOLEAN:  
  123.                 return cell.getBooleanCellValue() + "";  
  124.               
  125.             //错误类型  
  126.             case HSSFCell.CELL_TYPE_ERROR:  
  127.                 return cell.getErrorCellValue() + "";  
  128.         }  
  129.           
  130.         return "";  
  131.     }  
  132.   
  133. }  

    看控制台:



    好了,就介绍到这里吧,接下来,将写一个poi操作excel之批量导入、批量导出功能(包括模板文件的导入、导出功能)。

猜你喜欢

转载自blog.csdn.net/m_jack/article/details/80507938