使用POI操作Excel:Sheet拷贝

项目中很多模块需要将数据导出到Excel中,简单的如导出所有的用户信息到Excel,对于导出这种数据,可以通过POI/JXL直接生成Excel即可;当面临复杂格式的报表怎么办呢?下面这张图是项目中某张需要导出的Excel模版中部分截图,需求是根据查询条件生成N张同类型的这种单子到Excel中的不同Sheet中,后期要打印成纸质单据!需要明确有几个重点是:需要在A4纸中打印,所有打印出来的格式必须一样,可能后期这张表还会进行调整,必须满足其高扩展和变化性;

事实上我们依然可以通过程序将Excel写出来,事实上开始我确实也是这么做了,但是在做的过程中发现,要手写代码生成这种几十行的Excel实在是一个很大的工作量,尤其是对样式的控制更是繁琐;而且用程序生拼单元格生成Sheet不能正常打印到A4纸中,最后果断放弃,事实证明这个选择是正确的!

好吧,说了这么多总算进入正题,最后我选择了通过程序Copy整个Sheet的方式,采用通过这种实现方式,我只需要相关人员给我提供设置好模版,在批量生成的时候先通过Copy的方式生成新的Sheet,然后在向指定的Sheet中填写相关数据即可,而且当模版发生变化时只需调整Sheet中写值的代码即可!

重点是两个方法:copySheet和copyRow,主要代码如下:

package org.pihai.utils.excel.poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

/**
 * POI操作Excel
 * @since: 1.0
 * @version:1.0
 * @createTime:2011年07月21日 10:47:20
 * @updateTime:2011年07月21日 10:47:20
 * @author niejy  niejingyu@gmail.com
 * 
 */
public class PoiExcelSheetCopy {
	
	/**
	 * 根据源Sheet样式copy新Sheet
	 * @param fromsheetname
	 * @param newsheetname
	 * @param targetFile
	 */
	public void copySheet(String fromsheetname, String newsheetname,String targetFile) {
		HSSFWorkbook wb = null;
		try {
			FileInputStream fis = new FileInputStream(targetFile);
			wb = new HSSFWorkbook(fis);
			HSSFSheet fromsheet = wb.getSheet(fromsheetname);
			if (fromsheet != null && wb.getSheet(newsheetname) == null) {
				HSSFSheet newsheet = wb.createSheet(newsheetname);
				//设置打印参数
				newsheet.setMargin(HSSFSheet.TopMargin,fromsheet.getMargin(HSSFSheet.TopMargin));// 页边距(上)
				newsheet.setMargin(HSSFSheet.BottomMargin,fromsheet.getMargin(HSSFSheet.BottomMargin));// 页边距(下)
				newsheet.setMargin(HSSFSheet.LeftMargin,fromsheet.getMargin(HSSFSheet.LeftMargin) );// 页边距(左)
				newsheet.setMargin(HSSFSheet.RightMargin,fromsheet.getMargin(HSSFSheet.RightMargin));// 页边距(右
				
				HSSFPrintSetup ps = newsheet.getPrintSetup();
				ps.setLandscape(false); // 打印方向,true:横向,false:纵向(默认)
				ps.setVResolution((short)600);
				ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型
				
				File file = new File(targetFile);
				if (file.exists() && (file.renameTo(file))) {
					copyRows(wb, fromsheet, newsheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum());
					FileOutputStream fileOut = new FileOutputStream(targetFile);
					wb.write(fileOut);
					fileOut.flush();
					fileOut.close();
				} else {
					System.out.println("文件不存在或者正在使用,请确认...");
				}
			}
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 拷贝Excel行
	 * @param wb
	 * @param fromsheet
	 * @param newsheet
	 * @param firstrow
	 * @param lastrow
	 */
	public void copyRows(HSSFWorkbook wb, HSSFSheet fromsheet,HSSFSheet newsheet, int firstrow, int lastrow) {
		if ((firstrow == -1) || (lastrow == -1) || lastrow < firstrow) {
			return;
		}
		// 拷贝合并的单元格
		Region region = null;
		for (int i = 0; i < fromsheet.getNumMergedRegions(); i++) {
			region = fromsheet.getMergedRegionAt(i);
			if ((region.getRowFrom() >= firstrow)&& (region.getRowTo() <= lastrow)) {
				newsheet.addMergedRegion(region);
			}
		}

		HSSFRow fromRow = null;
		HSSFRow newRow = null;
		HSSFCell newCell = null;
		HSSFCell fromCell = null;
		// 设置列宽
		for (int i = firstrow; i <= lastrow; i++) {
			fromRow = fromsheet.getRow(i);
			if (fromRow != null) {
				for (int j = fromRow.getLastCellNum(); j >= fromRow.getFirstCellNum(); j--) {
					int colnum = fromsheet.getColumnWidth((short) j);
					if (colnum > 100) {
						newsheet.setColumnWidth((short) j, (short) colnum);
					}
					if (colnum == 0) {
						newsheet.setColumnHidden((short) j, true);
					} else {
						newsheet.setColumnHidden((short) j, false);
					}
				}
				break;
			}
		}
		// 拷贝行并填充数据
		for (int i = 0; i <= lastrow; i++) {
			fromRow = fromsheet.getRow(i);
			if (fromRow == null) {
				continue;
			}
			newRow = newsheet.createRow(i - firstrow);
			newRow.setHeight(fromRow.getHeight());
			for (int j = fromRow.getFirstCellNum(); j < fromRow.getPhysicalNumberOfCells(); j++) {
				fromCell = fromRow.getCell((short) j);
				if (fromCell == null) {
					continue;
				}
				newCell = newRow.createCell((short) j);
				newCell.setCellStyle(fromCell.getCellStyle());
				int cType = fromCell.getCellType();
				newCell.setCellType(cType);
				switch (cType) {
				case HSSFCell.CELL_TYPE_STRING:
					newCell.setCellValue(fromCell.getRichStringCellValue());
					break;
				case HSSFCell.CELL_TYPE_NUMERIC:
					newCell.setCellValue(fromCell.getNumericCellValue());
					break;
				case HSSFCell.CELL_TYPE_FORMULA:
					newCell.setCellFormula(fromCell.getCellFormula());
					break;
				case HSSFCell.CELL_TYPE_BOOLEAN:
					newCell.setCellValue(fromCell.getBooleanCellValue());
					break;
				case HSSFCell.CELL_TYPE_ERROR:
					newCell.setCellValue(fromCell.getErrorCellValue());
					break;
				default:
					newCell.setCellValue(fromCell.getRichStringCellValue());
					break;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		PoiExcelSheetCopy ew = new PoiExcelSheetCopy();
		ew.copySheet("template", "test2", "d:/template.xls");
	}
}

 

这段代码依赖POI的jar包,上面的代码可能还是不是很简洁,有待抽空进行优化!重点是先把这种解决方案分享给大家!


内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。
内容概要:本文围绕“考虑电动汽车灵活性的微网多时间尺度协调调度”展开研究,提出了一种基于Matlab代码实现的优化调度模型。该模型深入挖掘电动汽车作为灵活可控负荷与分布式储能单元的双重潜力,通过构建日前、日内及实时等多时间尺度的协调调度机制,有效应对光伏发电的间歇性与波动性,实现微电网内部功率的动态平衡。研究综合集成了电动汽车集群的有序充放电管理、储能系统协同优化与多种需求响应策略,建立了以系统运行成本最小化、可再生能源消纳最大化及供电可靠性最优化为目标的综合数学模型,并采用Matlab进行仿真求解。结果表明,所提方法能显著平抑功率波动,优化源-荷-储资源的时空配置,提升微电网运行的经济性与稳定性。; 适合人群:电气工程、能源与动力工程、控制科学与工程、电力系统及其自动化等专业的研究生、高校科研人员,以及从事智能电网、微电网规划、电动汽车与电网互动(V2G)技术研发的工程技术人员。; 使用场景及目标:①研究高比例可再生能源接入背景下,含大规模电动汽车的微电网协同优化运行策略;②掌握多时间尺度滚动优化的建模思想与Matlab/Simulink仿真技术;③探索电动汽车聚合商参与电力市场辅助服务的可行路径与效益评估方法; 阅读建议:建议读者结合提供的Matlab代码进行复现与调试,深入理解目标函数构建、约束条件处理及求解器调用等关键技术环节,可尝试引入电池老化模型、用户出行行为不确定性等更贴近实际的因素,以深化研究的实用性与前瞻性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值