活动介绍
file-type

Java读写Excel文件:实例代码详解

版权申诉

ZIP文件

134KB | 更新于2024-11-03 | 43 浏览量 | 0 下载量 举报 收藏
download 限时特惠:#14.90
在当今的信息化时代,数据处理是每个行业不可或缺的一部分。Microsoft Excel作为一款广泛使用的电子表格处理软件,因其功能强大、操作简便而深受广大用户的喜爱。在企业级应用中,经常需要通过编程语言如Java来实现对Excel文件的读写操作,以满足自动化、批量处理的需求。本资源集提供了一个名为"Read-and-write-EXCEL-file-by-Java.zip_excel"的压缩文件,其中包含了名为"java读取和写入EXCEL文件.pdf"的详细文档,该文档深入阐述了如何利用Java编程语言来操作Excel文件,并提供了丰富的代码示例,旨在帮助开发者简单上手实现Excel文件的读写功能。 ### Java操纵Excel的知识点 #### 1. 使用Java操纵Excel的技术选择 在Java中,操纵Excel文件主要可以通过以下几种技术实现: - **Apache POI**: Apache POI是一个开源的Java库,用于读写Microsoft Office格式的文件,包括Excel。POI提供了HSSF和XSSF两个库分别处理Excel的旧格式(.xls)和新格式(.xlsx)。 - **JExcelAPI**: JExcelAPI是另一个流行的开源库,专门用于读写Excel文件(.xls),它提供了对Excel文件操作的API。 - **OpenCSV**: 如果需要处理CSV文件格式,OpenCSV是一个很好的选择,它提供了简单的CSV文件读写操作。 - **EasyXLS**: EasyXLS是一个较新的库,它也支持读写Excel文件,并且与JExcelAPI相比,它能够更好地处理大型文件。 在本资源集中,主要关注使用Apache POI来操纵Excel文件,因为它是最广泛使用且社区支持强大的库之一。 #### 2. Apache POI的使用 Apache POI提供了以下主要接口和类用于操作Excel文件: - **HSSF**: HSSF是Horrible Spreadsheet Format的缩写,用于操作Excel文件的旧格式(.xls)。 - **XSSF**: XSSF是XML Spreadsheet的缩写,用于操作Excel的新格式(.xlsx)。 - **SXSSF**: SXSSF是Streaming Usermodel API的缩写,提供了一个低内存占用的API来操作大型的.xslx文件。 - **Workbook**: 表示Excel工作簿,是处理Excel文件时的根对象。 - **Sheet**: 表示Excel工作表。 - **Row**: 表示工作表中的单个行。 - **Cell**: 表示行中的单个单元格。 #### 3. 读取Excel文件 读取Excel文件首先需要创建一个Workbook对象,并根据文件类型加载相应的实现类。例如,读取旧格式的Excel文件(.xls)使用`HSSFWorkbook`类,而读取新格式(.xlsx)则使用`XSSFWorkbook`类。 #### 4. 写入Excel文件 写入Excel文件需要创建Workbook对象,并创建一个Sheet对象来添加行(Row),然后在行中添加单元格(Cell)并写入数据。完成数据添加后,使用输出流将Workbook对象写入到文件系统中。 #### 5. 使用代码示例 文档"java读取和写入EXCEL文件.pdf"中包含了丰富的代码示例,涵盖了从最基础的创建一个Excel文件、读取数据到高级操作,如样式设置、数据格式化等。每一个操作都有详细的注释,帮助开发者快速理解并运用到实际开发中。 ### 总结 通过本资源集中的详细文档和代码示例,开发者可以快速掌握使用Java操纵Excel文件的技术要点。文档内容详实,步骤清晰,配合代码注释,即使是Excel文件操作的初学者也能够轻松上手,实现Excel文件的自动化读写处理。这无疑将大大提升开发效率,缩短项目开发周期,帮助企业在数据处理方面更加得心应手。

相关推荐

filetype

15:50:28.339 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is NONE 15:50:28.366 [main] DEBUG com.alibaba.excel.context.AnalysisContextImpl - Initialization 'AnalysisContextImpl' complete java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid30672.hprof ... Heap dump file created [1102448651 bytes in 1.777 secs] Exception in thread "main" com.alibaba.excel.exception.ExcelAnalysisException: java.lang.OutOfMemoryError: Java heap space at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:61) at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:30) at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:214) at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:251) at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:243) at com.soyotec.unixde.dtm.common.impl.datafile.handler.ExcelDataHandler.readPage(ExcelDataHandler.java:38) at com.soyotec.unixde.dtm.common.impl.datafile.Test.main(Test.java:27) Caused by: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:155) at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:121) at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:108) at org.apache.poi.openxml4j.util.ZipArchiveFakeEntry.<init>(ZipArchiveFakeEntry.java:47) at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:53) at org.apache.poi.openxml4j.opc.ZipPackage.openZipEntrySourceStream(ZipPackage.java:210) at org.apache.poi.openxml4j.opc.ZipPackage.openZipEntrySource

filetype

Copy upgrade package successfully 2025-07-28 09:58:56.942 20477-20509 ISA_NAVI com.isa.navi I filename: KVM_EU_202502_T1.0_S31N.zip 2025-07-28 09:58:56.942 20477-20509 ISA_NAVI com.isa.navi I Start decrypting and verifying signatures 2025-07-28 09:58:56.943 20477-20509 ISA_NAVI_UPDATE com.isa.navi I dataVerification[verifyDataPath]:/data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip 2025-07-28 09:58:56.943 20477-20509 ISA_NAVI_UPDATE com.isa.navi I verifyDataPath[/data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip] -> signPath[/data/data/com.isa.navi/sign/] 2025-07-28 09:58:56.945 20477-20509 ISA_NAVI_ com.isa.navi I [ZipUtils.java:unzip:1] 开始解压ZIP文件: /data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip 到目录: /data/data/com.isa.navi/sign/ 2025-07-28 09:58:56.961 20477-20509 ISA_NAVI_ com.isa.navi I [ZipUtils.java:unzip:7] 成功创建输出目录: /data/data/com.isa.navi/sign/ 2025-07-28 09:58:56.962 20477-20509 ISA_NAVI_ com.isa.navi E [ZipUtils.java:unzip:68] 解压ZIP文件时发生错误: /data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip: open failed: ENOENT (No such file or directory) 2025-07-28 09:58:56.962 20477-20509 ISA_NAVI_ com.isa.navi E [ZipUtils.java:unzip:74] 解压过程中遇到错误,保留原始ZIP文件 2025-07-28 09:58:56.962 20477-20509 ISA_NAVI_ com.isa.navi I [ZipUtils.java:unzip:75] 解压结果: 失败 2025-07-28 09:58:56.963 20477-20509 ISA_NAVI_ com.isa.navi I [HmiJNIImpl.java:deleteRecursive:7] 已成功删除: /data/data/com.isa.navi/sign 2025-07-28 09:58:56.963 20477-20509 ISA_NAVI com.isa.navi E Decryption and signature verification failed 2025-07-28 09:58:57.021 20477-20509 ISA_NAVI com.isa.navi E deleteBySysteam:rm -r /data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip 2025-07-28 09:58:57.021 20477-20509 ISA_NAVI com.isa.navi E deleteBySysteam /data/data/com.isa.navi/KVM_EU_202502_T1.0_S31N.zip 2025-07-28 09:58:57.023 20477-20477 ISA_NAVI_UPDATE com.isa.navi I handleDownloadStatusChange : UpdateInfoBean{mapStatus=6, mUpdateNotification=UpdateNotification{updateResult=false, UpdateException='[Data package verification failed. Please check the update package and restart the update]', UpdateSuccessfulList=[ ], UpdateFailedList=[ ], inform=}, mUpdateMessage=UpdateMessage{country='', version='', totalSize=0.0, progress=0, isCurrentCountry=false, downloadSize=0.0, updateStatus=0}} 2025-07-28 09:58:57.023 20477-20477 ISA_NAVI_C...ackManager com.isa.navi I notifyUpdateStatus length : 0

filetype

@ApiOperation("批量下载图像及label文件成压缩包接口") @PostMapping("/downloadZip") public DeferredResult<ResponseEntity<StreamingResponseBody>> downloadZip(@RequestBody List<Long> ids) { DeferredResult<ResponseEntity<StreamingResponseBody>> deferredResult = new DeferredResult<>(3600000L); CompletableFuture.runAsync(() -> { try { // 提前校验数据 List<CpImageInfo> cpImageInfos = cpImageMapper.selectBatchIds(ids); if (cpImageInfos.isEmpty()) { throw new RuntimeException("未找到样本信息"); } String zipName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".zip"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDisposition(ContentDisposition.builder("attachment") .filename(URLEncoder.encode(zipName, "UTF-8")).build()); // 使用匿名内部类 StreamingResponseBody stream = new StreamingResponseBody() { @Override public void writeTo(OutputStream outputStream) throws IOException { try { fileImageService.downloadZip(ids, outputStream); } catch (Exception e) { log.error("文件流生成异常", e); throw new IOException("压缩过程发生错误"); } } }; deferredResult.setResult(ResponseEntity.ok() .headers(headers) .body(stream)); } catch (Exception e) { deferredResult.setErrorResult( ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("下载失败: " + e.getMessage())); } }); deferredResult.onTimeout(() -> deferredResult.setErrorResult( ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT) .body("下载超时"))); deferredResult.onError(ex -> deferredResult.setErrorResult( ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("系统错误: " + ex.getMessage()))); return deferredResult; } @Override public void downloadZip(List<Long> ids, OutputStream outputStream) throws IOException { List<CpImageInfo> cpImageInfos = cpImageMapper.selectBatchIds(ids); if (cpImageInfos.isEmpty()) { throw new RuntimeException("未找到样本信息"); } // 使用非缓冲流提高大文件性能 try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { zos.setLevel(Deflater.DEFAULT_COMPRESSION); // 平衡速度和压缩率 String rootDir = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "/"; int i = 0; for (CpImageInfo imageInfo : cpImageInfos) { if (Thread.currentThread().isInterrupted()) { throw new IOException("下载被中断"); } i++; String safeImageName = sanitizeFilename(imageInfo.getImageName()); String name = removeParentheses(safeImageName); String sampleDir = rootDir + name + "(" + i + ")/"; // 处理图像文件 List<CpImageBasicInfo> imageFiles = cpImageBasicMapper.selectByUniqueValue(imageInfo.getUniqueValue()); for (CpImageBasicInfo file : imageFiles) { addFileToZip(zos, sampleDir + "img/" + file.getImageName(), file.getImagePath()); } // 处理标签文件 List<CpLabelBasicInfo> labelFiles = cpLabelBasicMapper.selectByUniqueValue(imageInfo.getUniqueValue()); for (CpLabelBasicInfo file : labelFiles) { addFileToZip(zos, sampleDir + "gt/" + file.getLabelFileName(), file.getLabelFilePath()); } // 定期刷新输出流 zos.flush(); outputStream.flush(); } } } // 改进的文件添加方法 private void addFileToZip(ZipOutputStream zos, String entryName, String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { log.warn("文件不存在: {}", filePath); return; } try (FileInputStream fis = new FileInputStream(file)) { ZipEntry zipEntry = new ZipEntry(entryName); zos.putNextEntry(zipEntry); byte[] buffer = new byte[65536]; // 64KB 缓冲区 int len; while ((len = fis.read(buffer)) > 0) { // 检查是否中断 if (Thread.currentThread().isInterrupted()) { throw new IOException("下载被中断"); } zos.write(buffer, 0, len); } zos.closeEntry(); } } // 文件名消毒处理 private String sanitizeFilename(String filename) { return filename.replaceAll("[\\\\/:*?\"<>|]", "_"); } public String removeParentheses(String filename) { if (filename == null) { return null; } String result = filename; int prevLength; // 循环替换直到没有括号内容 do { prevLength = result.length(); result = result.replaceAll("\\(.*?\\)", ""); } while (result.length() < prevLength); return result; } 2025-06-06 10:56:59.176 ERROR 22432 --- [ MvcAsync1] c.a.e.c.sample.FileImageController : 文件流生成异常 org.apache.catalina.connector.ClientAbortException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。 at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:783) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:688) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:388) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:366) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253) ~[na:1.8.0_102] at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:211) ~[na:1.8.0_102] at java.util.zip.ZipOutputStream.write(ZipOutputStream.java:331) ~[na:1.8.0_102] at com.aircas.evaluation.service.impl.sample.FileImageInfoServiceImpl.addFileToZip(FileImageInfoServiceImpl.java:876) ~[classes/:na] at com.aircas.evaluation.service.impl.sample.FileImageInfoServiceImpl.downloadZip(FileImageInfoServiceImpl.java:841) ~[classes/:na] at com.aircas.evaluation.service.impl.sample.FileImageInfoServiceImpl$$FastClassBySpringCGLIB$$50be5633.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.20.jar:5.3.20] at com.aircas.evaluation.service.impl.sample.FileImageInfoServiceImpl$$EnhancerBySpringCGLIB$$5e579eb.downloadZip(<generated>) ~[classes/:na] at com.aircas.evaluation.controller.sample.FileImageController$1.writeTo(FileImageController.java:315) ~[classes/:na] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:111) [spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:98) [spring-webmvc-5.3.20.jar:5.3.20] at org.springframework.web.context.request.async.WebAsyncManager.lambda$startCallableProcessing$4(WebAsyncManager.java:337) [spring-web-5.3.20.jar:5.3.20] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_102] at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) ~[na:1.8.0_102] at java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:1.8.0_102] at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_102] Suppressed: org.apache.catalina.connector.ClientAbortException: java.io.IOException: The current thread was interrupted at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:783) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:688) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:388) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:366) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253) ~[na:1.8.0_102] at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:255) ~[na:1.8.0_102] at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:360) ~[na:1.8.0_102] at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:238) ~[na:1.8.0_102] at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:377) ~[na:1.8.0_102] at com.aircas.evaluation.service.impl.sample.FileImageInfoServiceImpl.downloadZip(FileImageInfoServiceImpl.java:854) ~[classes/:na] ... 14 common frames omitted Caused by: java.io.IOException: The current thread was interrupted at org.apache.tomcat.util.net.NioChannel.checkInterruptStatus(NioChannel.java:236) at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134) at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1384) at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:773) at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:593) at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:537) at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:547) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110) at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:194) at org.apache.coyote.Response.doWrite(Response.java:615) at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:340) ... 25 common frames omitted Caused by: java.io.IOException: 远程主机强迫关闭了一个现有的连接。 at sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:1.8.0_102] at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) ~[na:1.8.0_102] at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_102] at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_102] at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[na:1.8.0_102] at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:135) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1384) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:773) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:593) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:537) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:547) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:112) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:194) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.coyote.Response.doWrite(Response.java:615) ~[tomcat-embed-core-9.0.63.jar:9.0.63] at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:340) ~[tomcat-embed-core-9.0.63.jar:9.0.63] ... 24 common frames omitted

filetype

import zipfile import os import shutil def replace_in_docx(template_path, output_path, replacements): """直接修改docx文件内容(包括图表数据)""" # 创建临时工作目录 temp_dir = "temp_docx_unzip" os.makedirs(temp_dir, exist_ok=True) # 1. 解压原始DOCX文件 with zipfile.ZipFile(template_path, 'r') as in_zip: in_zip.extractall(temp_dir) # 2. 处理所有XML文件(包括正文和图表) process_xml_files(temp_dir, replacements) # 3. 处理嵌入的Excel文件(图表数据源) process_embedded_excel(temp_dir, replacements) # 4. 重新打包为新DOCX文件 with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as out_zip: for root, dirs, files in os.walk(temp_dir): for file in files: file_path = os.path.join(root, file) # 计算在ZIP中的相对路径 zip_path = os.path.relpath(file_path, temp_dir) out_zip.write(file_path, zip_path) # 5. 清理临时目录 shutil.rmtree(temp_dir) def process_xml_files(directory, replacements): """处理所有XML文件(正文、图表定义等)""" for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.xml') or file.endswith('.rels'): file_path = os.path.join(root, file) try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 进行替换 modified = False for key, value in replacements.items(): # 检查并替换原始占位符格式 if key in content: content = content.replace(key, str(value)) modified = True # 检查并替换带花括号的占位符格式 placeholder = f'{{{{{key}}}}}' if placeholder in content: content = content.replace(placeholder, str(value)) modified = True # 如果内容被修改,写回文件 if modified: with open(file_path, 'w', encoding='utf-8') as f: f.write(content) except Exception as e: print(f"处理文件 {file_path} 时出错: {e}") continue def process_embedded_excel(directory, replacements): """处理嵌入的Excel文件(图表数据源)""" embeddings_dir = os.path.join(directory, 'word', 'embeddings') if not os.path.exists(embeddings_dir): return for file in os.listdir(embeddings_dir): if file.startswith('Microsoft_Excel_Worksheet') and file.endswith('.xlsx'): excel_path = os.path.join(embeddings_dir, file) # 创建临时目录处理Excel temp_excel_dir = os.path.join(directory, 'temp_excel') os.makedirs(temp_excel_dir, exist_ok=True) # 解压Excel文件 with zipfile.ZipFile(excel_path, 'r') as excel_zip: excel_zip.extractall(temp_excel_dir) # 处理Excel中的所有XML文件 process_all_excel_xml_files(temp_excel_dir, replacements) # 重新打包Excel with zipfile.ZipFile(excel_path, 'w', zipfile.ZIP_DEFLATED) as new_excel: for root, dirs, files in os.walk(temp_excel_dir): for f in files: file_path = os.path.join(root, f) zip_path = os.path.relpath(file_path, temp_excel_dir) new_excel.write(file_path, zip_path) # 清理临时Excel目录 shutil.rmtree(temp_excel_dir) def process_all_excel_xml_files(directory, replacements): """处理Excel文件中的所有XML内容""" # 处理所有XML文件(包括共享字符串、工作表、图表等) for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.xml') or file.endswith('.rels'): file_path = os.path.join(root, file) try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 进行替换 modified = False for key, value in replacements.items(): # 检查并替换原始占位符格式 if key in content: content = content.replace(key, str(value)) modified = True # 检查并替换带花括号的占位符格式 placeholder = f'{{{{{key}}}}}' if placeholder in content: content = content.replace(placeholder, str(value)) modified = True # 如果内容被修改,写回文件 if modified: with open(file_path, 'w', encoding='utf-8') as f: f.write(content) except Exception as e: print(f"处理文件 {file_path} 时出错: {e}") continue # 使用示例 if __name__ == "__main__": # 示例数据 data = {} data['xsqc_df'] = 1 data['xsqc_xc'] = 2 data['xsqc_jk'] = 3 data['xsqc_cz'] = 4 data['xsqc_qt'] = 5 data['date'] = "2027年" # 处理文件名 output_dir = "output" output_filename = f"{data['date']}每日信息研判.docx" output_path = os.path.join(output_dir, output_filename) # 执行替换 replace_in_docx("模板.docx", output_path, data) print(f"文档已生成: {output_path}") 我使用上诉代码通过替换文件中图表的占位符 来写入文件中图表的数据 ,但上诉代码没有成功 请为我修改上诉代码 可以用任何的python库

小贝德罗
  • 粉丝: 112
上传资源 快速赚钱