【Java】利用poi插件,把Excel内容读入Java,把Java中的内容输出到Excel

上次在《【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007》(点击打开链接)给出了一种无须额外的Excel包就能够输出Java的内容的到Excel的方案,但是整个方案都是在操作能被Excel读取的.xml文件。构造.xml。这种方法编程起来可能有点麻烦,不够直观。因此,可以利用Apache官方开发的poi插件,实现Java与Excel的交互。


一、基本目标

首先在C盘有个1.xls,里面的内容如下:

【Java】利用poi插件,把Excel内容读入Java,把Java中的内容输出到Excel_第1张图片

然后通过Apache Poi Java插件利用Java可以读取出来,

之后再通过Apache Poi Java插件利用Java输出如下样式:



二、基本准备

1、首先打开Apache Poi的官网http://poi.apache.org/(点击打开链接),按照下图的顺序下载一个最新的稳定BIN版。顺便选择一个镜像,哪个快就搞哪个。

【Java】利用poi插件,把Excel内容读入Java,把Java中的内容输出到Excel_第2张图片

2、在Eclipse中新建一个Java工程,并且在里面新建一个lib文件夹。下载之后解压poi-bin-3.11-20141221.zip,把跟目录下的jar包,lib文件夹里面的jar包,ooxml-lib的Jar包,拷贝到你在Eclipse新建的Java工程下的新建出来的lib文件夹。

【Java】利用poi插件,把Excel内容读入Java,把Java中的内容输出到Excel_第3张图片

3、在Eclipse中为新建的Java工程添加这个额外的Jar插件。右击你新建的Java工程,属性,Java Build Path->Add JARs,选择刚刚拷贝过来lib文件夹的所有jar。那么Apache poi插件正式,在你的JAVA工程下工作。

【Java】利用poi插件,把Excel内容读入Java,把Java中的内容输出到Excel_第4张图片


三、制作过程

1、首先在Java头引入Poi插件。

package poiExcel;

//输入输出到文件必备
import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;
import org.apache.poi.poifs.filesystem.*;
2、先是把C:\1.xls的内容读取到Java里面来,逐个单元格输出

	public static void ExcelRead() throws Exception {
		//确定要操作的是c:/1.xls
		HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(
				new FileInputStream("c:/1.xls")));
		//取第0个单元表
		HSSFSheet sheet = workbook.getSheetAt(0);
		//sheet.getPhysicalNumberOfRows();求出所有行数
		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
			//取一行操作
			HSSFRow row = sheet.getRow(i);
			//row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数
			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
				System.out.print(row.getCell(j) + "\t");
			}
			System.out.println();
		}
	}
3、之后是在Java设置好整个单元格的样式,输出到Excel中。整个过程有点像JavaScript操作HTML的DOM节点。先构造单元格、再通过单元格构造行、最后通过行构造整张表,再把整张表输出的过程。

	public static void ExcelWrite() {

		// 创建一个webbook,对应一个Excel文件
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 在webbook中添加一个Excel单元表sheet,并设置单元表的问题
		HSSFSheet sheet = workbook.createSheet("单元表标题");

		// 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制
		HSSFRow row = sheet.createRow(0);
		// 创建一个居中样式
		HSSFCellStyle style = workbook.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 在于这个居中样式的基础上,添加表格边框样式
		setBoderStyle(style);
		// 创建第0个单元格
		HSSFCell cell = row.createCell(0);
		// 设置这个单元格的内容为“一”
		cell.setCellValue("一");
		// 设置这个单元格的格式为上面设置好的居中样式+表格边框样式
		cell.setCellStyle(style);
		// 同理创建第1个单元格并且设置好样式,下面以此类推
		cell = row.createCell(1);
		cell.setCellValue("二");
		cell.setCellStyle(style);
		cell = row.createCell(2);
		cell.setCellValue("三");
		cell.setCellStyle(style);

		// 创建第1行
		row = sheet.createRow(1);
		// 清空上面设置好的居中样式+表格边框样式
		style = workbook.createCellStyle();
		// 设置字体样式
		setFontStyle(workbook, style);
		cell = row.createCell(0);
		cell.setCellValue("111");
		cell.setCellStyle(style);
		cell = row.createCell(1);
		cell.setCellValue("222");
		cell.setCellStyle(style);
		cell = row.createCell(2);
		cell.setCellValue("333");
		cell.setCellStyle(style);
		// 自动调整列宽
		allColumnAutoSize(sheet);

		// 将文件存到指定位置
		try {
			//false代表覆盖输出
			FileOutputStream fileOutputStream = new FileOutputStream(
					"c:/1.xls", false);
			workbook.write(fileOutputStream);
			//人走带门
			fileOutputStream.close();
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
其中,涉及到设置边框样式的方法如下:

	public static void setBoderStyle(HSSFCellStyle style) {
		style.setBorderTop((short) 6); // 上边框为双线
		style.setBorderRight((short) 3); // 右边框为虚线
		style.setBorderBottom((short) 1); // 底边框为单线
		style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色
	}
设置单元格字体的方法如下:

	public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) {
		HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体
		font.setFontHeightInPoints((short) 16);// 字号
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
		font.setItalic(true);// 斜体
		font.setColor(HSSFColor.RED.index);// 字体颜色是红色
		style.setFont(font); // 把这个设置好的字体样色压入样式
	}

自动调整列宽的方法如下:

	public static void allColumnAutoSize(HSSFSheet sheet) {
		// 遍历所有单元格,把单元格皆设置为最优列宽。
		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
			HSSFRow row = sheet.getRow(i);
			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
				sheet.autoSizeColumn(j);
			}
		}
	}


四、总结

最后整个Java文件如下,主函数就两个方法,一个EXCEL到JAVA,一个JAVA到EXCEL。实际应用这个插件,创建单元格完全可以利用for与while等循环,从一个ArrayList读取数据,不停地填充单元格。

package poiExcel;

//输入输出到文件必备
import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;
import org.apache.poi.poifs.filesystem.*;

public class poiTest {

	public static void ExcelRead() throws Exception {
		//确定要操作的是c:/1.xls
		HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(
				new FileInputStream("c:/1.xls")));
		//取第0个单元表
		HSSFSheet sheet = workbook.getSheetAt(0);
		//sheet.getPhysicalNumberOfRows();求出所有行数
		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
			//取一行操作
			HSSFRow row = sheet.getRow(i);
			//row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数
			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
				System.out.print(row.getCell(j) + "\t");
			}
			System.out.println();
		}
	}

	public static void setBoderStyle(HSSFCellStyle style) {
		style.setBorderTop((short) 6); // 上边框为双线
		style.setBorderRight((short) 3); // 右边框为虚线
		style.setBorderBottom((short) 1); // 底边框为单线
		style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色
	}

	public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) {
		HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体
		font.setFontHeightInPoints((short) 16);// 字号
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
		font.setItalic(true);// 斜体
		font.setColor(HSSFColor.RED.index);// 字体颜色是红色
		style.setFont(font); // 把这个设置好的字体样色压入样式
	}

	public static void allColumnAutoSize(HSSFSheet sheet) {
		// 遍历所有单元格,把单元格皆设置为最优列宽。
		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
			HSSFRow row = sheet.getRow(i);
			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
				sheet.autoSizeColumn(j);
			}
		}
	}

	public static void ExcelWrite() {

		// 创建一个webbook,对应一个Excel文件
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 在webbook中添加一个Excel单元表sheet,并设置单元表的问题
		HSSFSheet sheet = workbook.createSheet("单元表标题");

		// 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制
		HSSFRow row = sheet.createRow(0);
		// 创建一个居中样式
		HSSFCellStyle style = workbook.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 在于这个居中样式的基础上,添加表格边框样式
		setBoderStyle(style);
		// 创建第0个单元格
		HSSFCell cell = row.createCell(0);
		// 设置这个单元格的内容为“一”
		cell.setCellValue("一");
		// 设置这个单元格的格式为上面设置好的居中样式+表格边框样式
		cell.setCellStyle(style);
		// 同理创建第1个单元格并且设置好样式,下面以此类推
		cell = row.createCell(1);
		cell.setCellValue("二");
		cell.setCellStyle(style);
		cell = row.createCell(2);
		cell.setCellValue("三");
		cell.setCellStyle(style);

		// 创建第1行
		row = sheet.createRow(1);
		// 清空上面设置好的居中样式+表格边框样式
		style = workbook.createCellStyle();
		// 设置字体样式
		setFontStyle(workbook, style);
		cell = row.createCell(0);
		cell.setCellValue("111");
		cell.setCellStyle(style);
		cell = row.createCell(1);
		cell.setCellValue("222");
		cell.setCellStyle(style);
		cell = row.createCell(2);
		cell.setCellValue("333");
		cell.setCellStyle(style);
		// 自动调整列宽
		allColumnAutoSize(sheet);

		// 将文件存到指定位置
		try {
			//false代表覆盖输出
			FileOutputStream fileOutputStream = new FileOutputStream(
					"c:/1.xls", false);
			workbook.write(fileOutputStream);
			//人走带门
			fileOutputStream.close();
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) throws Exception {
		ExcelRead();
		ExcelWrite();
	}

}


你可能感兴趣的:(Java,excel,poi,java,dom,jar)