本例使用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右键设置单元格格式