欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java使用POI操作excel文件

 更新時(shí)間:2017年03月23日 14:04:41   投稿:sxyy  
本文主要介紹了java使用POI操作excel文件,實(shí)現(xiàn)批量導(dǎo)出和導(dǎo)入的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧

一、POI的定義

JAVA中操作Excel的有兩種比較主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls為后綴的excel。而poi可以操作Excel 95及以后的版本,即可操作后綴為 .xls 和 .xlsx兩種格式的excel。

POI全稱(chēng) Poor Obfuscation Implementation,直譯為“可憐的模糊實(shí)現(xiàn)”,利用POI接口可以通過(guò)JAVA操作Microsoft office 套件工具的讀寫(xiě)功能。官網(wǎng):http://poi.apache.org ,POI支持office的所有版本,首先去官網(wǎng)下載如下界面:

下載完后,打開(kāi)“poi-bin-3.15-20160924.tar.gz”獲取操作excel需要的jar包,并將這些jar包復(fù)制到項(xiàng)目中。對(duì)于只操作2003 及以前版本的excel,只需要poi-3.15.jar ,如果需要同時(shí)對(duì)2007及以后版本進(jìn)行操作則需要復(fù)制

poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar

以及復(fù)制在ooxml-lib目錄下的xmlbeans-2.6.0.jar(但不知為何,我下的jar文件中沒(méi)有dom4j.jar)這個(gè)文件,還是加上dom4j.jar,防止報(bào)錯(cuò).

二、使用junit進(jìn)行操作Excel測(cè)試

首先明確Excel工作簿對(duì)象、工作表對(duì)象、行對(duì)象、以及單元格對(duì)象。

具體代碼如下注意要分清楚究竟是2007版本以前,還是2007版本以后(包括2007版本):下面這段代碼是2007版本以前的:

這段代碼只是將數(shù)據(jù)寫(xiě)入到Excel文件中創(chuàng)建

public static void main(String[] args) throws Exception {
  /**
   * 注意這只是07版本以前的做法對(duì)應(yīng)的excel文件的后綴名為.xls
   * 07版本和07版本以后的做法excel文件的后綴名為.xlsx
   */
  //創(chuàng)建新工作簿
  HSSFWorkbook workbook = new HSSFWorkbook();
  //新建工作表
  HSSFSheet sheet = workbook.createSheet("hello");
  //創(chuàng)建行,行號(hào)作為參數(shù)傳遞給createRow()方法,第一行從0開(kāi)始計(jì)算
  HSSFRow row = sheet.createRow(0);
  //創(chuàng)建單元格,row已經(jīng)確定了行號(hào),列號(hào)作為參數(shù)傳遞給createCell(),第一列從0開(kāi)始計(jì)算
  HSSFCell cell = row.createCell(2);
  //設(shè)置單元格的值,即C1的值(第一行,第三列)
  cell.setCellValue("hello sheet");
  //輸出到磁盤(pán)中
  FileOutputStream fos = new FileOutputStream(new File("E:\\root\\sheet\\11.xls"));
  workbook.write(fos);
  workbook.close();
  fos.close();
 }

結(jié)果如下圖:

同樣也可以對(duì)讀取Excel文件,得到Excel文件的數(shù)據(jù),并將其打印出來(lái),代碼如下:

@Test
 public void testReadExcel() throws Exception
 {
  //創(chuàng)建輸入流
  FileInputStream fis = new FileInputStream(new File("E:\\root\\sheet\\11.xls"));
  //通過(guò)構(gòu)造函數(shù)傳參
  HSSFWorkbook workbook = new HSSFWorkbook(fis);
  //獲取工作表
  HSSFSheet sheet = workbook.getSheetAt(0);
  //獲取行,行號(hào)作為參數(shù)傳遞給getRow方法,第一行從0開(kāi)始計(jì)算
  HSSFRow row = sheet.getRow(0);
  //獲取單元格,row已經(jīng)確定了行號(hào),列號(hào)作為參數(shù)傳遞給getCell,第一列從0開(kāi)始計(jì)算
  HSSFCell cell = row.getCell(2);
  //設(shè)置單元格的值,即C1的值(第一行,第三列)
  String cellValue = cell.getStringCellValue();
  System.out.println("第一行第三列的值是"+cellValue);
  workbook.close();
  fis.close();
 }

結(jié)果如下圖:

上面操作的都是07版本以前的Excel文件,即后綴名為.xls,07和07版本以后的Excel文件后綴名為.xlsx相應(yīng)的工作簿的對(duì)象名也改為:

//創(chuàng)建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();

代碼如下,創(chuàng)建excel文件并保存數(shù)據(jù)到excel文件:

@Test
 public void write07() throws Exception
 {
  //創(chuàng)建工作簿
  XSSFWorkbook workbook = new XSSFWorkbook();
  //新建工作表
  XSSFSheet sheet = workbook.createSheet("hello");
  //創(chuàng)建行,0表示第一行
  XSSFRow row = sheet.createRow(0);
  //創(chuàng)建單元格行號(hào)由row確定,列號(hào)作為參數(shù)傳遞給createCell;第一列從0開(kāi)始計(jì)算
  XSSFCell cell = row.createCell(2);
  //給單元格賦值
  cell.setCellValue("hello sheet");
  //創(chuàng)建輸出流
  FileOutputStream fos = new FileOutputStream(new File("E:\\root\\sheet\\hello.xlsx"));
  workbook.write(fos);
  workbook.close();
  fos.close();
 }

與之對(duì)應(yīng)的讀取數(shù)據(jù),代碼如下:

@Test
 public void read07() throws Exception
 {
  //創(chuàng)建輸入流
  FileInputStream fis = new FileInputStream(new File("E:\\root\\sheet\\hello.xlsx"));
  //由輸入流得到工作簿
  XSSFWorkbook workbook = new XSSFWorkbook(fis);
  //得到工作表
  XSSFSheet sheet = workbook.getSheet("hello");
  //得到行,0表示第一行
  XSSFRow row = sheet.getRow(0);
  //創(chuàng)建單元格行號(hào)由row確定,列號(hào)作為參數(shù)傳遞給createCell;第一列從0開(kāi)始計(jì)算
  XSSFCell cell = row.getCell(2);
  //給單元格賦值
  String cellValue = cell.getStringCellValue();
  System.out.println("C1的值是"+cellValue);
  int a[][] = new int[10][30];
  for(int i=0;i<a.length;i++)
  {
   System.out.println(i);
  }
  workbook.close();
  fis.close();
 }

問(wèn)題出現(xiàn)了,也可以解釋為需求:當(dāng)不能確定究竟是讀取07以前(例如2003,95,97,2000)還是07版本以后的Excel文件,我們當(dāng)然希望程序能夠自動(dòng)識(shí)別,并創(chuàng)建相應(yīng)的對(duì)象,去操作excel文件,代碼如下:

@Test
 public void reda03and07() throws Exception
 {
  //讀取03或07的版本
  String filePath = "E:\\root\\sheet\\hello.xlsx";
  if(filePath.matches("^.+\\.(?i)((xls)|(xlsx))$"))
  {
   FileInputStream fis = new FileInputStream(filePath);
   boolean is03Excell = filePath.matches("^.+\\.(?i)(xls)$")?true:false;
   Workbook workbook = is03Excell ? new HSSFWorkbook(fis):new XSSFWorkbook(fis);
   Sheet sheet = workbook.getSheetAt(0);
   Row row = sheet.getRow(0);
   Cell cell = row.getCell(2);
   System.out.println("第一行第一列的數(shù)據(jù)是:"+cell.getStringCellValue());
  }
 }

學(xué)完了上面幾個(gè)例子,接下來(lái)就是應(yīng)用它了,我們經(jīng)常需要在一個(gè)頁(yè)面中批量導(dǎo)出和批量導(dǎo)出數(shù)據(jù),這里就涉及到對(duì)excel文件的操作,當(dāng)然還有其它的文件格式,我們使用一個(gè)lList<User> list 來(lái)保存,在這里我們寫(xiě)了一個(gè)ExcelUtil這個(gè)工具類(lèi):代碼如下:

package com.ittax.core.util;
import java.util.List;
import javax.servlet.ServletOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHeader;
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;
import com.ittax.nsfw.user.entity.User;
/**
 * excel工具類(lèi),支持批量導(dǎo)出
 * @author lizewu
 *
 */
public class ExcelUtil {
  /**
   * 將用戶的信息導(dǎo)入到excel文件中去
   * @param userList 用戶列表
   * @param out 輸出表
   */
  public static void exportUserExcel(List<User> userList,ServletOutputStream out)
  {
    try{
      //1.創(chuàng)建工作簿
      HSSFWorkbook workbook = new HSSFWorkbook();
      //1.1創(chuàng)建合并單元格對(duì)象
      CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,4);//起始行,結(jié)束行,起始列,結(jié)束列
      //1.2頭標(biāo)題樣式
      HSSFCellStyle headStyle = createCellStyle(workbook,(short)16);
      //1.3列標(biāo)題樣式
      HSSFCellStyle colStyle = createCellStyle(workbook,(short)13);
      //2.創(chuàng)建工作表
      HSSFSheet sheet = workbook.createSheet("用戶列表");
      //2.1加載合并單元格對(duì)象
      sheet.addMergedRegion(callRangeAddress);
      //設(shè)置默認(rèn)列寬
      sheet.setDefaultColumnWidth(25);
      //3.創(chuàng)建行
      //3.1創(chuàng)建頭標(biāo)題行;并且設(shè)置頭標(biāo)題
      HSSFRow row = sheet.createRow(0);
      HSSFCell cell = row.createCell(0);
      //加載單元格樣式
      cell.setCellStyle(headStyle);
      cell.setCellValue("用戶列表");
      //3.2創(chuàng)建列標(biāo)題;并且設(shè)置列標(biāo)題
      HSSFRow row2 = sheet.createRow(1);
      String[] titles = {"用戶名","賬號(hào)","所屬部門(mén)","性別","電子郵箱"};
      for(int i=0;i<titles.length;i++)
      {
        HSSFCell cell2 = row2.createCell(i);
        //加載單元格樣式
        cell2.setCellStyle(colStyle);
        cell2.setCellValue(titles[i]);
      }
      //4.操作單元格;將用戶列表寫(xiě)入excel
      if(userList != null)
      {
        for(int j=0;j<userList.size();j++)
        {
          //創(chuàng)建數(shù)據(jù)行,前面有兩行,頭標(biāo)題行和列標(biāo)題行
          HSSFRow row3 = sheet.createRow(j+2);
          HSSFCell cell1 = row3.createCell(0);
          cell1.setCellValue(userList.get(j).getName());
          HSSFCell cell2 = row3.createCell(1);
          cell2.setCellValue(userList.get(j).getAccount());
          HSSFCell cell3 = row3.createCell(2);
          cell3.setCellValue(userList.get(j).getDept());
          HSSFCell cell4 = row3.createCell(3);
          cell4.setCellValue(userList.get(j).isGender()?"男":"女");
          HSSFCell cell5 = row3.createCell(4);
          cell5.setCellValue(userList.get(j).getEmail());
        }
      }
      //5.輸出
      workbook.write(out);
      workbook.close();
      //out.close();
    }catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  /**
   * 
   * @param workbook
   * @param fontsize
   * @return 單元格樣式
   */
  private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontsize) {
    // TODO Auto-generated method stub
    HSSFCellStyle style = workbook.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    //創(chuàng)建字體
    HSSFFont font = workbook.createFont();
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    font.setFontHeightInPoints(fontsize);
    //加載字體
    style.setFont(font);
    return style;
  }
}

緊接著就是在UseService中調(diào)用方法并寫(xiě)出exportExcel方法:

@Override
  public void exportExcel(List<User> userList, ServletOutputStream out) {
    // TODO Auto-generated method stub
    ExcelUtil.exportUserExcel(userList, out);
  }
  @Override
  public void importExcel(File file, String excelFileName) {
    // TODO Auto-generated method stub
    //1.創(chuàng)建輸入流
    try {
      FileInputStream inputStream = new FileInputStream(file);
      boolean is03Excel = excelFileName.matches("^.+\\.(?i)(xls)$");
      //1.讀取工作簿
      Workbook workbook = is03Excel?new HSSFWorkbook(inputStream):new XSSFWorkbook(inputStream);
      //2.讀取工作表
      Sheet sheet = workbook.getSheetAt(0);
      //3.讀取行
      //判斷行數(shù)大于二,是因?yàn)閿?shù)據(jù)從第三行開(kāi)始插入
      if(sheet.getPhysicalNumberOfRows() > 2)
      {
        User user = null;
        //跳過(guò)前兩行
        for(int k=2;k<sheet.getPhysicalNumberOfRows();k++ )
        {
          //讀取單元格
          Row row0 = sheet.getRow(k);
          user = new User();
          //用戶名
          Cell cell0 = row0.getCell(0);
          user.setName(cell0.getStringCellValue());
          //賬號(hào)
          Cell cell1 = row0.getCell(1);
          user.setAccount(cell1.getStringCellValue());
          //所屬部門(mén)
          Cell cell2 = row0.getCell(2);
          user.setDept(cell2.getStringCellValue());
          //設(shè)置性別
          Cell cell3 = row0.getCell(3);
          boolean gender = cell3.getStringCellValue() == "男"?true:false;
          user.setGender(gender);
          //設(shè)置手機(jī)
          String mobile = "";
          Cell cell4 = row0.getCell(4);
          try {
            mobile = cell4.getStringCellValue();
          } catch (Exception e) {
            // TODO Auto-generated catch block
            double dmoblie = cell4.getNumericCellValue();
            mobile = BigDecimal.valueOf(dmoblie).toString();
          }
          user.setMobile(mobile);
          //設(shè)置電子郵箱
          Cell cell5 = row0.getCell(5);
          user.setEmail(cell5.getStringCellValue());
          //默認(rèn)用戶密碼是123456
          user.setPassword("123456");
          //用戶默認(rèn)狀態(tài)是有效
          user.setState(User.USER_STATE_VALIDE);
          //保存用戶
          save(user);
        }
      }
      workbook.close();
      inputStream.close();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

最后就是在Action中調(diào)用service方法:

//導(dǎo)出用戶列表
    public void exportExcel()
    {
      try
      {
        //1.查找用戶列表
        userList = userService.findObjects();
        //2.導(dǎo)出
        HttpServletResponse response = ServletActionContext.getResponse();
        //這里設(shè)置的文件格式是application/x-excel
        response.setContentType("application/x-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String("用戶列表.xls".getBytes(), "ISO-8859-1"));
        ServletOutputStream outputStream = response.getOutputStream();
        userService.exportExcel(userList, outputStream);
        if(outputStream != null)
          outputStream.close();
      }catch(Exception e)
      {
        e.printStackTrace();
      }
    }
    public String importExcel()
    {
      if(userExcel!= null)
      {
        //判斷是否是Excel文件
        if(userExcelFileName.matches("^.+\\.(?i)((xls)|(xlsx))$"))
        {
          userService.importExcel(userExcel, userExcelFileName);
        }
      }
      return"list";
    }

注意的是應(yīng)該使用ServletOutputStream這個(gè)類(lèi),最后實(shí)現(xiàn)了批量導(dǎo)出和導(dǎo)入數(shù)據(jù)。

導(dǎo)出用戶結(jié)果如下圖;

導(dǎo)入結(jié)果如下圖;

導(dǎo)入前:

導(dǎo)入后的結(jié)果;

ok,關(guān)于POI操作EXCEL文件就暫時(shí)到此為止了

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 基于springboot?配置文件context-path的坑

    基于springboot?配置文件context-path的坑

    這篇文章主要介紹了基于springboot?配置文件context-path的坑,基于很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 批量將現(xiàn)有Jar包上傳到Maven私服

    批量將現(xiàn)有Jar包上傳到Maven私服

    今天小編就為大家分享一篇關(guān)于批量將現(xiàn)有Jar包上傳到Maven私服,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java與SpringBoot對(duì)redis的使用方式

    Java與SpringBoot對(duì)redis的使用方式

    這篇文章主要介紹了Java與SpringBoot對(duì)redis的使用方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • Java代碼編譯和反編譯的那些事兒

    Java代碼編譯和反編譯的那些事兒

    這篇文章主要給大家介紹了關(guān)于Java代碼編譯和反編譯的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • springboot 如何使用jackson來(lái)處理實(shí)體類(lèi)

    springboot 如何使用jackson來(lái)處理實(shí)體類(lèi)

    這篇文章主要介紹了springboot使用jackson來(lái)處理實(shí)體類(lèi)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射

    SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射

    在SpringBoot項(xiàng)目中,靜態(tài)資源存放在static目錄下,使得前端可以通過(guò)URL來(lái)訪問(wèn)這些資源,我們就需要將文件系統(tǒng)的文件路徑與URL建立一個(gè)映射關(guān)系,把文件系統(tǒng)中的文件當(dāng)成我們的靜態(tài)資源即可,本文給大家介紹SpringBoot本地存儲(chǔ)與路徑映射的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-12-12
  • 深入解析Spring中的@Bean注解

    深入解析Spring中的@Bean注解

    這篇文章主要介紹了深入解析Spring中的@Bean注解,Spring的@Bean注解用于告訴方法,產(chǎn)生一個(gè)Bean對(duì)象,然后這個(gè)Bean對(duì)象交給Spring管理,產(chǎn)生這個(gè)Bean對(duì)象的方法Spring只會(huì)調(diào)用一次,隨后這個(gè)Spring將會(huì)將這個(gè)Bean對(duì)象放在自己的IOC容器中,需要的朋友可以參考下
    2023-07-07
  • Java多線程之并發(fā)編程的核心AQS詳解

    Java多線程之并發(fā)編程的核心AQS詳解

    AQS ( AbstractQueuedSynchronizer)是一個(gè)用來(lái)構(gòu)建鎖和同步器的框架,使用AQS能簡(jiǎn)單且高效地構(gòu)造出應(yīng)用廣泛的大量的同步器,下面小編和大家來(lái)一起學(xué)習(xí)一下吧
    2021-09-09
  • SpringBoot大事務(wù)問(wèn)題的常用優(yōu)化方案

    SpringBoot大事務(wù)問(wèn)題的常用優(yōu)化方案

    大事務(wù)是指運(yùn)行時(shí)間比較長(zhǎng),操作的數(shù)據(jù)比較多的事務(wù)123,大事務(wù)的產(chǎn)生原因包括操作的數(shù)據(jù)比較多、大量的鎖競(jìng)爭(zhēng)、事務(wù)中有其他非數(shù)據(jù)庫(kù)的耗時(shí)操作等,本文給大家總結(jié)了SpringBoot大事務(wù)問(wèn)題的常用優(yōu)化方案,需要的朋友可以參考下
    2024-04-04
  • 如何根據(jù)帶賬號(hào)密碼的WSDL地址生成JAVA代碼

    如何根據(jù)帶賬號(hào)密碼的WSDL地址生成JAVA代碼

    這篇文章主要介紹了如何根據(jù)帶賬號(hào)密碼的WSDL地址生成JAVA代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論