1.创建 Excel 的工作簿。
//HSSFWorkbook 是 Apache POI 库中用于处理 Excel 97-2003 文件格式 (.xls) 的类
//new HSSFWorkbook():创建了一个新的、空的 Excel 工作簿对象,可以在其上执行操作,
//例如添加工作、表、写入数据等
HSSFWorkbook wb = new HSSFWorkbook();
导包:import org.apache.poi.hssf.usermodel.HSSFWorkbook;
2.创建一个工作表(shell页)
//代表创建一个名为'sheet0'的工作表
HSSFSheet sheet = wb.createSheet("sheet" + 0);
3.对表格内容行进行设置字体和单元格样式
- 使用普通字体(宋体,10号字,普通加粗),设置细边框(上下左右)和垂直居中对齐。普通加粗即为正常的粗细
1.创建字体样式,使用工作簿对象进行创建
//方法返回一个 HSSFFont 实例,可以用它来定义字体的属性
HSSFFont fontNormal = wb.createFont();
//设置字体的大小为10磅。setFontHeightInPoints 方法接受一个 short 类型的参数,指定字体的高度。
fontNormal.setFontHeightInPoints((short)10);
//设置字体名称为“宋体”。setFontName 方法用来指定字体的名称,以便在 Excel 中应用这个字体样式
fontNormal.setFontName("宋体");
//设置字体的粗细。HSSFFont.BOLDWEIGHT_NORMAL 表示普通粗细(即非粗体)。
//setBoldweight 方法接受一个整型参数,定义字体的粗细等级。
fontNormal.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
---其他一些
fontNormal.setBold(false); // 设置为非粗体
fontNormal.setItalic(false); // 设置为非斜体
2.使单元格应用字体样式,并进行单元格设置
//创建一个新的 HSSFCellStyle 对象 styleBorderNormal。
//HSSFCellStyle 用于定义单元格的样式,例如边框、对齐方式、字体等。
HSSFCellStyle styleBorderNormal = wb.createCellStyle();
//设置单元格底部的边框样式为细边框。HSSFCellStyle.BORDER_THIN 是一个常量,表示边框的厚度为细边框。
styleBorderNormal.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置单元格左侧的边框样式为细边框。这与底部边框的设置类似,但应用于单元格的左边。
styleBorderNormal.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置单元格右侧的边框样式为细边框。
styleBorderNormal.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置单元格顶部的边框样式为细边框。
styleBorderNormal.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置单元格的垂直对齐方式为居中对齐。HSSFCellStyle.VERTICAL_CENTER 是一个常量,表示内容在单元格的垂直方向上居中。
styleBorderNormal.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//将之前创建的字体 fontNormal 应用到这个单元格样式上。这样,使用这个样式的单元格就会使用指定的字体。
styleBorderNormal.setFont(fontNormal);
4.对表头进行设置字体和单元格样式
- 使用加粗字体(宋体,10号字,加粗),设置细边框(上下左右)和水平居中对齐。
1.创建字体样式
HSSFFont fontBold = wb.createFont();
fontBold.setFontHeightInPoints((short)10);
fontBold.setFontName("宋体");
//设置粗体
fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2.创建单元格对象,设置字体样式,和单元格样式
HSSFCellStyle styleBorderBold = wb.createCellStyle();
styleBorderBold.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleBorderBold.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleBorderBold.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleBorderBold.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleBorderBold.setFont(fontBold);
//设置垂直居中对齐
styleBorderBold.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中
5.创建标题行
1.在表的对象下,创建一个新的行对象
注意:
- 行的索引是从0开始的,因此
(short) (0)
实际上是工作表中的第一行。 - 如果你希望创建其他位置的行,可以将
(short) (0)
替换为相应的行索引。 -
高度单位: 在Excel中,行的高度是以“点”作为单位的。1点等于1/72英寸。通常来说,
(short)400
指的是行高为400点。这在实际应用中相当于大约5.56英寸(400 / 72)。 -
设置行高:
setHeight
方法允许你指定一个行的高度,这样你可以控制每一行的显示大小。这对于格式化表格并使其内容更具可读性非常重要。
//这里的 (short) (0) 表示在工作表的第一行(索引从0开始)创建一个新行
//新行的位置是第0行,也就是工作表的第一行。
//创建的行被赋值给变量 row,你可以通过 row 对象进一步操作这行中的单元格。
HSSFRow row = sheet.createRow((short) (0)); //标题行
//setHeight 是 HSSFRow 类的一个方法,用于设置行的高度。
//short)400 是一个参数,表示行的高度值,以“点”(points)为单位。short 是数据类型,用于表示这个参数的值。
row.setHeight((short)400);
2.创建表头内容,用于列的标题
String[] tColName = new String[]{"序号","赔案号","赔付金额","险种号码","从共保方名称","收费金额","收费日期","从共保方名称","收费金额","收费日期","从共保方名称"};
3.将表头内容添加到行的对象中,生成表头的行
for (int m = 0; m < tColName.length; m++) {
//设置列宽 --begin
sheet.setDefaultColumnWidth((short) 18);
// if(m == 0){
// sheet.setColumnWidth((short)m, (short)3000);
// }else if(m == 2){
// sheet.setColumnWidth((short)m, (short)3000);
// }else if(m == 7){
// sheet.setColumnWidth((short)m, (short)3000);
// }
//设置列宽 --end
//创建单元格对象,并设置第几个单元格,单元格计数从0开始
HSSFCell cell = row.createCell((short) (m));
//查看该位置是否存在单元格了,不存在单元格返回null,代表可以在该位置添加单元格
cell = row.getCell((short)m);
//该索引位置不存在单元格
//这里的检查确保如果 getCell 方法返回 null(即单元格尚不存在),则创建一个新的单元格。
if(cell == null){
//创建新的单元格
cell = row.createCell((short)m);
}
//设置单元格的内容为字符串
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//设置单元格的样式,将之前定义的单元格的样式对象赋进来
//之前创建的样式:列的表头
cell.setCellStyle(styleBorderBold);
//设置单元格的字符编码
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//给当前的单元格位置,添加内容
cell.setCellValue(tColName[m]);
}
sheet
: 这是一个HSSFSheet
对象,代表一个Excel工作表
setDefaultColumnWidth((short) 18)
:
setDefaultColumnWidth
是HSSFSheet
类的方法,用于设置所有列的默认宽度。18
是列宽的值,以字符宽度单位来表示。(short)
是数据类型转换,确保传递给方法的是一个short
类型的值。
- 列宽单位: 在Apache POI库(用于操作Excel的Java库)中,列宽的单位是基于字符的宽度。具体来说,
18
表示列的宽度可以容纳18个字符的宽度。这个宽度是基于默认字体的宽度计算的,因此不同字体可能会导致实际显示的列宽有所不同。
- 默认宽度: 使用
setDefaultColumnWidth((short) 18)
方法会影响到所有未单独设置宽度的列。设置后,新创建的列和没有显式设置宽度的列将自动应用这个默认宽度。
row.createCell((short) (m))
: 在指定的行row
中创建一个新的单元格,位置由(short) (m)
指定。这里的(short) (m)
是列的索引,从0开始。HSSFCell cell
: 创建的单元格对象被赋值给变量cell
。row.getCell((short)m)
: 获取指定列索引(short)m
处的单元格。如果该位置上已经存在单元格,getCell
方法将返回该单元格;否则,它将返回null
。setCellType(HSSFCell.CELL_TYPE_STRING)
: 设置单元格的类型为字符串类型。这表示单元格将包含文本数据。setCellStyle(styleBorderBold)
: 设置单元格的样式为styleBorderBold
。这是一个CellStyle
对象,通常用于设置单元格的格式,如边框、字体加粗等。setEncoding(HSSFCell.ENCODING_UTF_16)
: 设置单元格的编码为 UTF-16。这通常用于处理字符编码,确保支持国际化字符。setCellValue(tColName[m])
: 将单元格的值设置为tColName[m]
。这里tColName
是一个数组或列表,m
是索引,表示要放入单元格的具体文本值。
6.给表格添加内容
注:当前的sql语句执行原因,需使用for循环进行,所以以下代码不能普遍适用,如果给单元格添加内容可以参考之上代码,对于换行,使用HSSFRow row = sheet.createRow((short) (0)); 方法来定义当sheet.createRow((short) (0):0:代表第一行,1代表第二行,依次类推
int xh = 0;
String clmno ="";
// String RealPay="";
// String RiskCode ="";
// String coname ="";
// String coinsuranceshare="";
// String SumActuPayMoney ="";
// String data = "";
String[] tData = null;
int count = 0 ;
int index = 7;
HSSFRow row1 = null ;//设置行
outerLoop:for(int i=1;i<=tSSRS.getMaxRow();i++) {
tData = new String[] { tSSRS.GetText(i, 1),tSSRS.GetText(i, 2),tSSRS.GetText(i, 3),tSSRS.GetText(i, 4),tSSRS.GetText(i, 5),tSSRS.GetText(i, 6) } ;
HSSFCell cell = null ;
if(clmno==null || clmno == "" || !clmno.equals(tSSRS.GetText(i, 1))) {
xh = xh + 1 ;
//System.out.println("当前为第:"+xh+"行");
row1 = sheet.createRow((short) (xh)); //内容行
row1.setHeight((short)400);
//设置第一列为序号,表现为自增
cell = row1.createCell((short) (0));
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(styleBorderNormal);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(xh);
for (int j = 0; j < 6; j++) {
cell = row1.createCell((short) (j + 1));
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(styleBorderNormal);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(tData[j]);
}
count = 0 ;//行数从0开始计算
index=7;//已经走了7个单元格
}else {
for (int j = 0; j < tColName.length; j++) {
index++;//一个单元格加一
cell = row1.createCell((short) (j + 7+(count*3)));//在一行时,单元格从第8个开始放,单元格计数从0开始
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(styleBorderNormal);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(tData[j+3]);//数据为同一赔案时,将从共保方名称,收费金额,收费日期向后放
System.out.println("第:"+index+"个单元格");
if(index >=tColName.length) {
System.out.println("单元格一行已满不在添加");
break outerLoop;//当单元格的一行填满时,不在进行添加,跳出整个循环
}
if(j+3==5) {
break;
}
}
count = count + 1 ;
}
clmno = tSSRS.GetText(i, 1);
// xh += 1 ;
// RealPay=tSSRS.GetText(i, 2);
// RiskCode =tSSRS.GetText(i, 3);
// coname =tSSRS.GetText(i, 4);
// coinsuranceshare=tSSRS.GetText(i, 5);
// SumActuPayMoney =tSSRS.GetText(i, 6);
// data = tSSRS.GetText(i, 7);
}
indexcount = xh;//记录总数
System.out.println("单元格总行数是:" + indexcount);
}
7.导出
String fileName ="理赔共保数据导出清单";
HSSFWorkbook wb = HSSFWorkbook wb = new HSSFWorkbook();
BufferedOutputStream bos = null;
try {
OutputStream outOS = response.getOutputStream();
bos = new BufferedOutputStream(outOS);
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename="+ java.net.URLEncoder.encode(fileName, "UTF-8")+".xls");
wb.write(bos);
bos.flush();
Content = "下载完成";
FlagStr = "Succ";
System.out.println("下载成功" + Content + "=========" + FlagStr);
} catch (Exception e) {
System.out.println("导出Excel失败!" + e.toString());
FlagStr = "Fail";
Content = "导出失败!原因可能是:" + e.toString();
}finally {
if(bos != null){
bos.close();
}
}
System.out.println("over!!!!!!");
}
导出代码的response:
- 这是
HttpServletResponse
对象的方法,用于获取与客户端响应关联的OutputStream
。
这个代码回到出一个空的Excel通用直接复制就行,要想有内容要设置导出之前的内容,那些是给Excel表里边进行填值的
这个导出的代码需写在和前端交互的地方,原因就是用的response
8.总结
- HSSFWorkbook wb = new HSSFWorkbook();
- wb操作的:
- HSSFSheet sheet = wb.createSheet("sheet" + 0);创建sheel页:创建一个名为sheet0的表格
- HSSFRow row = sheet.createRow((short) (0)); 创建一个sheet中的行:0代表第一行
- row.setHeight((short)400);设置行高:适用于当前行:这里是第一行
- HSSFCell cell = row.createCell((short) (m)):创建单元格,某一行下的第几个单元格
- cell.setCellStyle(styleBorderBold):给单元格设置单元格样式
- sheet.setDefaultColumnWidth((short) 18);设置列宽:通用:整个sheet也通用
- HSSFFont fontNormal = wb.createFont();创建字体样式
- HSSFCellStyle styleBorderNormal = wb.createCellStyle():创建单元格样式
- styleBorderNormal .setFont(fontNormal );给单元格样式添加字体样式
- sheet页中的所有索引都是从0开始
https://www.cnblogs.com/xushuyi/articles/4520545.html:这个是别的一个导出Excel