poi对excel进行添加图片操作

本文介绍了一种在Excel中根据特定条件自动插入图片的方法。通过遍历表格单元格并检查其内容,当找到匹配项时,将在指定位置插入一张图片。
	/**
	 * excel 插入图片
	 * @param imgPath
	 * @param filePath
	 */
	public static boolean excelImage(String imageFilePath,String sourceFilePath, String destPath) {
		FileOutputStream fileOut = null;
		Workbook wb = null;
		boolean result = true;
		try {
			
			String imghz = imageFilePath.substring(
					imageFilePath.lastIndexOf(".")+1, imageFilePath.length());
			
			String excelhz = sourceFilePath.substring(
					sourceFilePath.lastIndexOf("."), sourceFilePath.length());
			
			// 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
			ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
			BufferedImage bufferImg = ImageIO.read(new File(imageFilePath));
			ImageIO.write(bufferImg, imghz.toUpperCase(), byteArrayOut);
			
			if(excelhz.endsWith(".xls")){
				POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(
						sourceFilePath));
				// 创建excel2003的文件文本抽取对象
				wb = new HSSFWorkbook(fs);
				HSSFSheet sheet = (HSSFSheet) wb.getSheetAt(0);
				// 创建一个工作薄
				Drawing patriarch = sheet.createDrawingPatriarch();
				Iterator rows = sheet.rowIterator();
				while (rows.hasNext()) {
					HSSFRow row = (HSSFRow) rows.next();
					int columnNum = row.getPhysicalNumberOfCells();
					if (row != null) {
						for (int i = 0; i < columnNum; i++) {
							HSSFCell cell = row.getCell(i);
							int CELLTYPE = 0;
							if (cell != null) {
								CELLTYPE = cell.getCellType();
								cell.setCellType(XSSFCell.CELL_TYPE_STRING);
							}
							if (cell == null
									|| cell.getStringCellValue() == null) {
								continue;
							}
							String value = cell.getStringCellValue().trim();

							if (!"".equals(value)) {
								if(value.contains("东调继") || value.contains("东调限") ){
									int col1 = cell.getColumnIndex();
									int row1 = row.getRowNum();
									if(col1>=1){
										col1 = col1-1;
									}
									if(row1>=1){
										row1 = row1-1;
									}
									HSSFClientAnchor anchor = new HSSFClientAnchor();
									anchor.setCol1(col1);
									anchor.setRow1(row1);
							        int pictureIdx = wb.addPicture(
											byteArrayOut.toByteArray(),
											HSSFWorkbook.PICTURE_TYPE_JPEG);
							        org.apache.poi.ss.usermodel.Picture pic = patriarch.createPicture(anchor, pictureIdx);
							        pic.resize(1.0);
								}
							} else {
								cell.setCellValue("");
							}
							if(CELLTYPE != XSSFCell.CELL_TYPE_NUMERIC){//判断原先数据属性是否为数字类型(如果是的话就不转为数字类型,因为转为数字会导致结果不一致)
								cell.setCellType(CELLTYPE);
							}

						}
					}
				}
		        
		        
			}else{
				wb = new XSSFWorkbook(sourceFilePath);
				XSSFSheet sheet = (XSSFSheet) wb.getSheetAt(0);
				
//				// 创建一个工作薄
				Drawing patriarch = sheet.createDrawingPatriarch();
				Iterator rows = sheet.rowIterator();
				while (rows.hasNext()) {
					XSSFRow row = (XSSFRow) rows.next();
					if (row != null) {
						int columnNum = row.getPhysicalNumberOfCells();
						for (int i = 0; i < columnNum; i++) {
							XSSFCell cell = row.getCell(i);
							int CELLTYPE = 0;

							if (cell != null) {
								CELLTYPE = cell.getCellType();
								cell.setCellType(XSSFCell.CELL_TYPE_STRING);
							}
							if (cell == null || cell.getStringCellValue() == null) {
								continue;
							}
							String value = cell.getStringCellValue().trim();
							if (!"".equals(value)) {
								if(value.contains("东调继") || value.contains("东调限") ){
									int col1 = cell.getColumnIndex();
									int row1 = row.getRowNum();
									if(col1>=1){
										col1 = col1-1;
									}
									if(row1>=1){
										row1 = row1-1;
									}
									XSSFClientAnchor anchor = new XSSFClientAnchor();
									anchor.setCol1(col1);
									anchor.setRow1(row1);
							        int pictureIdx = wb.addPicture(
											byteArrayOut.toByteArray(),
											XSSFWorkbook.PICTURE_TYPE_JPEG);
							        org.apache.poi.ss.usermodel.Picture pic = patriarch.createPicture(anchor, pictureIdx);
							        pic.resize(1.0);
								}
							} else {
								cell.setCellValue("");
							}
							if(CELLTYPE != XSSFCell.CELL_TYPE_NUMERIC){//判断原先数据属性是否为数字类型(如果是的话就不转为数字类型,因为转为数字会导致结果不一致)
								cell.setCellType(CELLTYPE);
							}
							
						}
					}
				}
			}
			
			fileOut = new FileOutputStream(destPath);
			
			// 写入excel文件
			wb.write(fileOut);
			System.out.println("----Excle文件已生成------");
		} catch (Exception e) {
			e.printStackTrace();
			result = false;
			return result;
		} finally {
			if (fileOut != null) {
				try {
					fileOut.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		return result;
	}

随着工业控制、汽车电子、航空航天等领域对嵌入式系统实时性要求的不断提升,嵌入式实时操作系统(RTOS)的调度延迟已成为制约系统性能的关键因素。FreeRTOS作为一款广泛应用的开源实时操作系统,其抢占式调度机制在面对高优先级任务密集触发的场景时,仍存在调度延迟不确定、抖动较大等问题,难以满足毫秒级甚至微秒级的实时响应需求。本文针对FreeRTOS调度延迟优化展开深入研究,旨在通过分析调度延迟来源、优化中断临界区与优先级继承协议,显著降低调度抖动,提升系统实时性与确定性。本文首先对FreeRTOS抢占式调度机制进行系统性剖析,识别出中断响应延迟、任务切换开销、优先级翻转以及中断临界区过长等四大延迟来源。针对中断临界区问题,提出了基于精细粒度锁的优化策略,将原有关键段保护范围从完整函数缩小至最小必要代码块,同时采用编译器指令优化上下文切换流程,使中断临界区长度缩短约40%。在优先级继承协议方面,改进了协议的执行流程,引入延迟继承机制,避免不必要的优先级调整操作,将优先级继承的平均耗时降低约35%。此外,对任务切换过程中的寄存器保存与恢复策略进行了优化,通过汇编级优化减少了约20%的任务切换时间。实验结果表明,优化后的系统中断响应时间从平均4.2μs降低至2.5μs,任务切换时间从平均3.8μs降低至3.0μs,最大调度抖动从12.5μs降低至5.2μs,最坏情况执行时间降低约38%。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论基础 第3章 FreeRTOS调度延迟来源分析 第4章 调度延迟优化方案设计 第5章 优化方案详细实现 第6章 性能测试平台搭建与实验分析 第7章 总结与展望 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值