1.Excel内置了49种单元格样式
2.用户可以自定义单元格样式
1.内置样式类:org.apache.poi.ss.usermodel.BuiltinFormats
2.索引对应的单元格样式字符串
索引 样式字符串
0, "General"
1, "0"
2, "0.00"
3, "#,##0"
4, "#,##0.00"
5, "$#,##0_);($#,##0)"
6, "$#,##0_);[Red]($#,##0)"
7, "$#,##0.00);($#,##0.00)"
8, "$#,##0.00_);[Red]($#,##0.00)"
9, "0%"
0xa, "0.00%"
0xb, "0.00E+00"
0xc, "# ?/?"
0xd, "# ??/??"
0xe, "m/d/yy"
0xf, "d-mmm-yy"
0x10, "d-mmm"
0x11, "mmm-yy"
0x12, "h:mm AM/PM"
0x13, "h:mm:ss AM/PM"
0x14, "h:mm"
0x15, "h:mm:ss"
0x16, "m/d/yy h:mm"
// 0x17 - 0x24 reserved for international and undocumented
0x17 "reserved-0x17"
0x18 "reserved-0x18"
0x19 "reserved-0x19"
0x1A "reserved-0x1A"
0x1B "reserved-0x1B"
0x1C "reserved-0x1C"
0x1D "reserved-0x1D"
0x1E "reserved-0x1E"
0x1F "reserved-0x1F"
0x20 "reserved-0x20"
0x21 "reserved-0x21"
0x22 "reserved-0x22"
0x23 "reserved-0x23"
0x24 "reserved-0x24"
0x25, "#,##0_);(#,##0)"
0x26, "#,##0_);[Red](#,##0)"
0x27, "#,##0.00_);(#,##0.00)"
0x28, "#,##0.00_);[Red](#,##0.00)"
0x29, "_( #,##0_);_( (#,##0);_( \"-\"_);_(@_)"
0x2a, "_($ #,##0_);_($ (#,##0);_($ \"-\"_);_(@_)"
0x2b, "_( #,##0.00_);_( (#,##0.00);_( \"-\"??_);_(@_)"
0x2c, "_($ #,##0.00_);_($ (#,##0.00);_($ \"-\"??_);_(@_)"
0x2d, "mm:ss"
0x2e, "[h]:mm:ss"
0x2f, "mm:ss.0"
0x30, "##0.0E+0"
0x31, "@" - This is text format.
0x31 "text" - Alias for "@"
3.0x17 - 0x24 为保留样式
4."TEXT"与@作用相同,不区分大小写
5.可以根据单元格样式字符串获取索引,或者根据索引获取单元格样式字符串
1.用户自定义单元格样式索引从164开始
2.用户可以创建自定义数字格式字符串,这种字符串由一个或多个自定义数字说明符组成,用于定义设置数值数据格式的方式。 自定义数字格式字符串是任何不属于标准数字格式字符串的格式字符串。
格式说明符 |
名称 |
描述 |
示例 |
---|---|---|---|
“0” |
零占位符 |
用对应的数字(如果存在)替换零;否则,将在结果字符串中显示零。 |
1234.5678 ("00000") -> 01235 |
"#" |
数字占位符 |
用对应的数字(如果存在)替换“#”符号;否则,不会在结果字符串中显示任何数字。 请注意,如果输入字符串中的相应数字是无意义的 0,则在结果字符串中不会出现任何数字。例如,0003 ("####") -> 3。 |
1234.5678 ("#####") -> 1235 |
"." |
小数点 |
确定小数点分隔符在结果字符串中的位置。 |
0.45678 ("0.00", en-US) -> 0.46 |
"," |
组分隔符和数字比例换算 |
千分符 |
组分隔符说明符: 2147483647 ("##,#", en-US) -> 2,147,483,647 |
"%" |
百分比占位符 |
将数字乘以 100,并在结果字符串中插入本地化的百分比符号。 |
0.3697 ("%#0.00", en-US) -> %36.97 0.3697 ("##.0 %", en-US) -> 37.0 % |
"‰" |
千分比占位符 |
将数字乘以 1000,并在结果字符串中插入本地化的千分比符号。 |
0.03697 ("#0.00‰", en-US) -> 36.97‰ |
“E0” “E+0” “E-0” “e0” “e+0” “e-0” |
指数表示法 |
如果后跟至少一个 0(零),则使用指数表示法设置结果格式。 “E”或“e”指示指数符号在结果字符串中是大写还是小写。 跟在“E”或“e”字符后面的零的数目确定指数中的最小位数。 加号 (+) 指示符号字符总是置于指数前面。 减号 (-) 指示符号字符仅置于负指数前面。 |
987654 ("#0.0e0") -> 98.8e4 1503.92311 ("0.0##e+00") -> 1.504e+03 1.8901385E-16 ("0.0e+00") -> 1.9e-16 |
\ |
转义符 |
使下一个字符被解释为文本而不是自定义格式说明符。 |
987654 ("\###00\#") -> #987654# |
'string' "string" |
文本字符串分隔符 |
指示应复制到未更改的结果字符串的封闭字符。 |
68 ("# ' degrees'") -> 68 degrees 68 ("# ' degrees'") -> 68 degrees |
; |
部分分隔符 |
通过分隔格式字符串定义正数、负数和零各部分。 |
12.345 ("#0.0#;(#0.0#);-\0-") -> 12.35 0 ("#0.0#;(#0.0#);-\0-") -> -0- -12.345 ("#0.0#;(#0.0#);-\0-") -> (12.35) 12.345 ("#0.0#;(#0.0#)") -> 12.35 0 ("#0.0#;(#0.0#)") -> 0.0 -12.345 ("#0.0#;(#0.0#)") -> (12.35) |
其他 |
所有其他字符 |
字符将复制到未更改的结果字符串。 |
68 ("# °") -> 68 ° |
部分数目 |
描述 |
---|---|
一个部分 |
格式字符串应用于所有值。 |
两个部分 |
第一部分应用于正值和零,第二部分应用于负值。 如果要设置格式的数字为负,但根据第二部分中的格式舍入后为零,则最终的零根据第一部分进行格式设置。 |
三个部分 |
第一部分应用于正值,第二部分应用于负值,第三部分应用于零。 第二部分可以留空(分号间没有任何内容),在这种情况下,第一部分应用于所有非零值。 如果要设置格式的数字为非零值,但根据第一部分或第二部分中的格式舍入后为零,则最终的零根据第三部分进行格式设置。 |
1.对单元格值进行格式化:org.apache.poi.ss.usermodel.DataFormatter
2.HSSFCell中存储原始值(或原始值索引)和单元格样式索引,所以需要获取跟Excel显示数据一样的显示值时,需要对数据进行格式化。支持的格式包括货币,SSN,百分比,小数,日期,电话号码,邮政编码等。
3.格式化方法
DataFormatter | 方法描述 |
---|---|
String formatCellValue(Cell cell) | 返回给定单元格格式化后的单元格值 |
public String formatRawCellContents(double value, int formatIndex, String formatString) | 根据给定给定double值、样式索引和样式字符串,返回格式化后单元格值 处理数值单元格 |
4.日期格式处理 - org.apache.poi.ss.usermodel.DateUtil
public static boolean isADateFormat(int formatIndex, String formatString) | 判断单元格样式是否为日期样式 |
public static boolean isValidExcelDate(double value) | 判断一个double值是否一个有效的Excel日期 |
public static boolean isInternalDateFormat(int format) | 检查样式索引format是否为内置日期样式 |
public static boolean isCellInternalDateFormatted(Cell cell) | 判断单元格cell是否是一个内置日期单元格 |
public static boolean isCellDateFormatted(Cell cell) | 判断单元格是否是一个日期单元格 |
public static double getExcelDate(Date date) | 将一个date转换一个Excel内部表现形式的double值,从1900年1月1日开始算起 返回-1表示错误 |
public static double getExcelDate(Date date, boolean use1904windowing) | 将一个date转换一个Excel内部表现形式的double值 use1904windowing=true表示从1904年1月1日开始算起,false表示从1900年1月1日算起 返回-1表示错误 |
public static Date getJavaDate(double date) | 将一个Excel double值转换为一个从1900年1月1日开始算起的Java日期值。返回null表示一个非法Excel日期 |
package hssf.sheet.dataformat;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
public class ExportDataFormat {
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\Administrator\\Desktop\\test.xls");
if (file.exists()) {
file.delete();
}
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.xls"));
exportExcel(out);
} finally {
out.close();
}
}
/**
* @param out
* @throws IOException
*/
private static void exportExcel(BufferedOutputStream out) throws IOException {
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet();
sheet.setColumnWidth(0, 20*256);
sheet.setColumnWidth(2, 20*256);
sheet.setColumnWidth(4, 20*256);
// 第一行
Row row1 = sheet.createRow(0);
row1.setHeightInPoints(30);
Cell cell1 = row1.createCell(0);
cell1.setCellValue(12.34567);
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
cell1.setCellStyle(style);
setDateFormat(workbook, row1, style, new Date(), "@");
setDataFormat(workbook, row1, 4, style, -123.45678, "@");
// 第二行 - #0.00
Row row2 = sheet.createRow(1);
setDataFormat(workbook, row2, 0, style, 12.34567, "#0.000");
setDateFormat(workbook, row2, style, new Date(), "yyyy年MM月dd日");
setDataFormat(workbook, row2, 4, style, 123.45678, "#0.00;#0.000;!\"!\"");
// 第三行 - #,##0.00
Row row3 = sheet.createRow(2);
setDataFormat(workbook, row3, 0, style, 1234.56789, "#,##0.000");
setDateFormat(workbook, row3, style, new Date(), "yyyy年M月d日");
setDataFormat(workbook, row3, 4, style, -123.45678, "#0.00;#0.000;!\"!\"");
// 第四行 - 0,00.00
Row row4 = sheet.createRow(3);
setDataFormat(workbook, row4, 0, style, 12.34567, "0,00.000");
setDateFormat(workbook, row4, style, new Date(), "yyyy-MM-dd");
setDataFormat(workbook, row4, 4, style, 0, "#0.00;#0.000;!\"!\"");
// 第五行
Row row5 = sheet.createRow(4);
setDateFormat(workbook, row5, style, new Date(), "yyyy/MM/dd");
workbook.write(out);
}
private static void setDateFormat(Workbook workbook, Row row, CellStyle style, Date date, String formatStr) {
row.setHeightInPoints(30);
Cell cell = row.createCell(2);
cell.setCellValue(date);
CellStyle style2 = workbook.createCellStyle();
style2.cloneStyleFrom(style);
cell.setCellStyle(style2);
DataFormat format2 = workbook.createDataFormat();
style2.setDataFormat(format2.getFormat(formatStr));
}
private static void setDataFormat(Workbook workbook, Row row, int colIndex, CellStyle style, double value, String formatStr) {
row.setHeightInPoints(30);
Cell cell = row.createCell(colIndex);
cell.setCellValue(value);
CellStyle style2 = workbook.createCellStyle();
style2.cloneStyleFrom(style);
cell.setCellStyle(style2);
DataFormat format2 = workbook.createDataFormat();
style2.setDataFormat(format2.getFormat(formatStr));
}
}