POI对EXCEL的操作 (重点:如何设置CELL格式为文本格式)

本例使用POI3.8,具体下载地址就不奉上了,网上一搜全是

1. 首先先创建一个Student类(此处不管是内部类,外部类都行)

class Student {
	private int id;
	private String name;
	private String idCardNumber;

	/** default constructor */
	public Student() {
	}

	/** full constructor */
	public Student(int id, String name, String idCardNumber) {
		this.id = id;
		this.name = name;
		this.idCardNumber = idCardNumber;

	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getIdCardNumber() {
		return idCardNumber;
	}

	public void setIdCardNumber(String idCardNumber) {
		this.idCardNumber = idCardNumber;
	}
}


2. 具体生成Ecel的代码和算法,此处并没有连接数据库,如果想连接数据库,在getDate()方法里改变代码就行

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFooter;
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;

public class Test {

	// 表头
	public static final String[] tableHeader = { "序号", "学生姓名", "学生学号" };
	// 创建工作本 TOS
	public static HSSFWorkbook demoWorkBook = new HSSFWorkbook();
	// 创建表
	public static HSSFSheet demoSheet = demoWorkBook
			.createSheet("学生信息");
	// 表头的单元格个数目
	public static final short cellNumber = (short) tableHeader.length;
	// 数据库表的列数
	public static final int columNumber = 1;

	/**
	 * 创建表头
	 * 
	 * @return
	 */
	public static void createTableHeader() {
		HSSFHeader header = demoSheet.getHeader();
		header.setCenter("学生信息");
		HSSFRow headerRow = demoSheet.createRow(0);
		for (int i = 0; i < cellNumber; i++) {
			HSSFCell headerCell = headerRow.createCell(i);
			headerCell.setCellType(HSSFCell.CELL_TYPE_STRING);
			headerCell.setCellValue(tableHeader[i]);
		}
	}

	/**
	 * 创建行
	 * 
	 * @param cells
	 * @param rowIndex
	 */
	public static void createTableRow(List<String> cells, short rowIndex) {
		// 创建第rowIndex行
		HSSFRow row = demoSheet.createRow(rowIndex);
		for (int i = 0; i < cells.size(); i++) {
			// 创建第i个单元格
			HSSFCell cell = row.createCell(i);
			if (cell.getCellType() != 1) {
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			}

			// 新增的四句话,设置CELL格式为文本格式
			HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();
			HSSFDataFormat format = demoWorkBook.createDataFormat();
			cellStyle2.setDataFormat(format.getFormat("@"));
			cell.setCellStyle(cellStyle2);

			cell.setCellValue(cells.get(i));
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
		}
	}

	/**
	 * USE:用于获取Student的数据。。。假数据。到时候:你连接数据库的到List<Student>的数据就行了。 共生成
	 * 100条数据.相当于100行
	 * 
	 * @return
	 */
	public List<Student> getDate() {
		List<Student> cacheList = new ArrayList<Student>();
		for (int j = 0; j < 10; j++) {
			Student tb = new Student();
			tb.setId(j + 1);
			tb.setName("张三");
			tb.setIdCardNumber("021109307");
			cacheList.add(tb);
		}
		return cacheList;
	}

	/**
	 * 创建整个Excel表
	 * 
	 * @throws SQLException
	 * 
	 */
	public void createExcelSheet() throws SQLException {
		createTableHeader();
		int rowIndex = 1;

		List<Student> list = getDate();

		for (int j = 0; j < list.size(); j++) {
			List<String> listRead = new ArrayList<String>();
			for (int i = 1; i <= columNumber; i++) {
				listRead.add(list.get(i).getId() + "");
				listRead.add(list.get(i).getName());
				listRead.add(list.get(i).getIdCardNumber());
				listRead.add(rowIndex + "");
			}
			createTableRow(listRead, (short) rowIndex);
			rowIndex++;
		}
	}

	/**
	 * 导出表格
	 * 
	 * @param sheet
	 * @param os
	 * @throws IOException
	 */
	public void exportExcel(HSSFSheet sheet, OutputStream os)
			throws IOException {
		sheet.setGridsPrinted(true);
		HSSFFooter footer = sheet.getFooter();
		footer.setRight("Page " + HSSFFooter.page() + " of "
				+ HSSFFooter.numPages());
		demoWorkBook.write(os);
	}

	public static void main(String[] args) {
		String fileName = "e:\\学生信息.xls";
		FileOutputStream fos = null;
		try {
			Test pd = new Test();
			pd.createExcelSheet();
			fos = new FileOutputStream(fileName);
			pd.exportExcel(demoSheet, fos);
			JOptionPane.showMessageDialog(null, "表格已成功导出到 : " + fileName);
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "表格导出出错,错误信息 :" + e
					+ "\n错误原因可能是表格已经打开。");
			e.printStackTrace();
		} finally {
			try {
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

说明:
   1)  有关涉及更改EXCEL的CELL格式为字符串,如图一般情况下大家导出的EXCEL表格CELL格式通常是常规的

这个问题,通常大家都是想到既然是设置CELL格式肯定是通过cell.setCellType(HSSFCell.CELL_TYPE_STRING)然后插入数据再导出,诚然这种想法是对的,实际上不能起到任何作用,因为这个方法就是EXCEL默认的格式,写不写都一样。
 

第一段:Excel的单元格格式
图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的HSSFDataFormat类里都有相应的定义。
HSSFDataFormat是HSSF子项目里面定义的一个类。类HSSFDataFormat允许用户新建数据格式类型。HSSFDataFormat类包含静态方法static java.lang.String getBuiltinFormat(short index),它可以根据编号返回内置数据类型。另外static short getBuiltinFormat(java.lang.String format)方法则可以根据数据类型返回其编号,static java.util.List getBuiltinFormats()可以返回整个内置的数据格式列表。
在HSSFDataFormat里一共定义了49种内置的数据格式,如下面所示。

 HSSFDataFormat的数据格式

内置数据类型
编号

"General"
0

"0"
1

"0.00"
2

"#,##0"
3

"#,##0.00"
4

"($#,##0_);($#,##0)"
5

"($#,##0_);[Red]($#,##0)"
6

"($#,##0.00);($#,##0.00)"
7

"($#,##0.00_);[Red]($#,##0.00)"
8

"0%"
9

"0.00%"
0xa

"0.00E+00"
0xb

"# ?/?"
0xc

"# ??/??"
0xd

"m/d/yy"
0xe

"d-mmm-yy"
0xf

"d-mmm"
0x10

"mmm-yy"
0x11

"h:mm AM/PM"
0x12

"h:mm:ss AM/PM"
0x13

"h:mm"
0x14

"h:mm:ss"
0x15

"m/d/yy h:mm"
0x16

保留为过国际化用
0x17 - 0x24

"(#,##0_);(#,##0)"
0x25

"(#,##0_);[Red](#,##0)"
0x26

"(#,##0.00_);(#,##0.00)"
0x27

"(#,##0.00_);[Red](#,##0.00)"
0x28

"_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"
0x29

"_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"
0x2a

"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
0x2b

"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
0x2c

"mm:ss"
0x2d

"[h]:mm:ss"
0x2e

"mm:ss.0"
0x2f

"##0.0E+0"
0x30

"@" - This is text format
0x31

在上面表中,字符串类型所对应的是数据格式为"@"(最后一行),也就是HSSFDataFormat中定义的值为0x31(49)的那行。Date类型的值的范围是0xe-0x11。  

 

第二段:POI中Excel文件Cell的类型
在读取每一个Cell的值的时候,通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型,如下面所示。

Cell的类型

CellType
说明

CELL_TYPE_BLANK
空值

CELL_TYPE_BOOLEAN
布尔型

CELL_TYPE_ERROR
错误

CELL_TYPE_FORMULA
公式型

CELL_TYPE_STRING
字符串型

CELL_TYPE_NUMERIC
数值型

一般都采用CELL_TYPE_STRING和CELL_TYPE_NUMERIC类型,因为在Excel文件中只有字符串和数字。如果Cell的Type为CELL_TYPE_NUMERIC时,还需要进一步判断该Cell的数据格式,因为它有可能是Date类型,在Excel中的Date类型也是以Double类型的数字存储的。Excel中的Date表示当前时间与1900年1月1日相隔的天数,所以需要调用HSSFDateUtil的isCellDateFormatted方法,判断该Cell的数据格式是否是Excel Date类型。如果是,则调用getDateCellValue方法,返回一个Java类型的Date。

 

好了读完上面两段文字我想大家关于CELL类型和格式应该清楚了,更应该清楚的是到底怎么才能将‘设置单元格格式’改成文本然后再导出

解决方案:就是上面代码中的ExcelOut类里面createTableRow方法中的一段代码

            HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();

            HSSFDataFormat format = demoWorkBook.createDataFormat();

            cellStyle2.setDataFormat(format.getFormat("@"));

            cell.setCellStyle(cellStyle2);

看最终导出效果图吧,点击任何一个CELL右键设置单元格格式

 

 

你可能感兴趣的:(exception,Date,数据库,String,Excel,Constructor)