java导出Excel

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值