1. 程式人生 > >Java POI 匯出Excel(一)

Java POI 匯出Excel(一)

序言

上篇序言已經說明了我為什麼要寫這個教程了,如果想知道請戳這個連結:序言。那麼廢話就不多說開始吧。

POI Maven 依賴

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

POI讀取Office2007以上版本的xlsx檔案

例項程式碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class WorkbookExample {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 匯出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//讀入檔案流
		InputStream inputStream = new FileInputStream(new File(path));
		//建立Excel物件
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都會有一個預設的sheet,所以直接獲取第一個sheet
		Sheet sheet = wb.getSheetAt(0);
		//建立第一行
		Row row = sheet.createRow(0);
		//設定A1的值
		row.createCell(0).setCellValue("A1");
		//輸出檔案
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------輸出成功");
	}
}

可見輸出的檔案:


開啟之後可見A1的值為A1:


POI讀取Office2007以下版本的xls檔案

POI讀取2007版本以下的Excel即可以使用Workbook類,也可以使用HSSFWorkbook類。但是注意,HSSFWorkbook不能讀取*.xlsx字尾的檔案,因為不相容。

HSSFWorkbook例項程式碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

public class HSSFWorkbookExample {
	
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
	
	/**
	 * 匯出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example12-export.xls";
	
	public static void main(String[] args) throws Exception {
		//讀入檔案流
		InputStream inputStream = new FileInputStream(new File(path));
		//建立Excel物件
		HSSFWorkbook wb = new HSSFWorkbook(inputStream);
		//一般Excel都會有一個預設的sheet,所以直接獲取第一個sheet
		Sheet sheet = wb.getSheetAt(0);
		//建立第一行
		Row row = sheet.createRow(0);
		//設定A1的值
		row.createCell(0).setCellValue("A1");
		//輸出檔案
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------輸出成功");
	}
}

執行後輸出檔案:


開啟後可見輸出結果:


如果HSSFWorkbook讀取Excel2007版本以上的檔案就會導致報錯:

Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
	at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:398)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:379)
	at com.poi.example.HSSFWorkbookExample.main(HSSFWorkbookExample.java:27)

單元格合併

在POI的設定之中是需要先定義好合並單元格再建立行的。例項如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;

public class WorkbookExample2 {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 匯出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//讀入檔案流
		InputStream inputStream = new FileInputStream(new File(path));
		//建立Excel物件
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都會有一個預設的sheet,所以直接獲取第一個sheet
		Sheet sheet = wb.getSheetAt(0);
		/*
		 * 這裡 第一個引數是起始行,第二個引數是結束行。
		 * 第三個引數是起始列,第四個引數是結束列
		 * 本例中的含義是A1和A2合併
		 * 
		 * */
		sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
		//建立第一行
		Row row = sheet.createRow(0);
		//設定A1的值
		row.createCell(0).setCellValue("A1");
		//輸出檔案
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------輸出成功");
	}
}

輸出結果如下:


資料格式

資料格式網上有許多正確例項程式碼來說明各種資料型別是如何格式化的。此處只是提及一下如何引入格式化。例項程式碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;

public class WorkbookExample3 {
		
	/**
	 * 原始Excel模板地址
	 */
	private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
	
	/**
	 * 匯出的Excel模板地址
	 */
	private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
	
	public static void main(String[] args) throws Exception {
		//讀入檔案流
		InputStream inputStream = new FileInputStream(new File(path));
		//建立Excel物件
		Workbook wb = WorkbookFactory.create(inputStream);
		//一般Excel都會有一個預設的sheet,所以直接獲取第一個sheet
		Sheet sheet = wb.getSheetAt(0);
		/*
		 * 這裡 第一個引數是起始行,第二個引數是結束行。
		 * 第三個引數是起始列,第四個引數是結束列
		 * 本例中的含義是A1和A2合併
		 * 
		 * */
		sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
		//建立第一行
		Row row = sheet.createRow(0);
		//設定A1的值
		row.createCell(0).setCellValue(100.22222222222222222d);
		//設定資料型別
		//setCellType(0)是一個過時的方法,並不建議使用
		//row.getCell(0).setCellType(0);
		//設定保留2位小數
		row.getCell(0).setCellType(CellType.NUMERIC);
		//設定保留小數位
		DataFormat format = wb.createDataFormat();
		CellStyle style = wb.createCellStyle();
		style.setDataFormat(format.getFormat("0.00"));
		row.getCell(0).setCellStyle(style);
		
		//輸出檔案
		FileOutputStream out = new FileOutputStream(export);
        wb.write(out);
        System.out.println("----------------輸出成功");
	}
}

輸出結果:


結束語

本篇文章先介紹到這裡,後續的具體樣式調整下一個篇幅再更新。