本例使用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格式通常是常规的
第一段: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右键设置单元格格式