poi生成横向文档以及复杂表头
代码:
//创建页面并且创建横向A4XWPFDocument doc = new XWPFDocument();CTDocument1 document = doc.getDocument();CTBody body = document.getBody();if (!body.isSetSectPr()) {body.addNewSectPr();}CTSectPr section = body.getSectPr();if (!section.isSetPgSz()) {section.addNewPgSz();}CTPageSz pageSize = section.getPgSz();//必须要设置下面两个参数,否则整个的代码是无效的pageSize.setW(BigInteger.valueOf(15840));pageSize.setH(BigInteger.valueOf(12240));pageSize.setOrient(STPageOrientation.LANDSCAPE);//创建标题XWPFParagraph titleP = doc.createParagraph();titleP.setAlignment(ParagraphAlignment.CENTER);XWPFRun titleR = titleP.createRun();titleR.setText("日报(" + time + ")");titleR.setBold(true);//设置为粗体titleR.setFontFamily("华文中宋");titleR.setFontSize(14);titleR.addCarriageReturn();//创建表头XWPFTable table = doc.createTable();table.setWidth("100%");table.setWidthType(TableWidthType.PCT);//设置表格相对宽度table.setTableAlignment(TableRowAlign.CENTER);XWPFTableRow headerRow = table.getRow(0);headerRow.getCell(0).setText("施工单位");headerRow.addNewTableCell().setText("工程项目");headerRow.addNewTableCell().setText("施工项目");headerRow.addNewTableCell().setText("单位");headerRow.addNewTableCell().setText("计划工程量");headerRow.addNewTableCell().setText("");headerRow.addNewTableCell().setText("累计完成量");headerRow.addNewTableCell().setText("");headerRow.addNewTableCell().setText("");headerRow.addNewTableCell().setText("完成比例");headerRow.addNewTableCell().setText("");headerRow.getCell(0).setWidth("600");headerRow.getCell(1).setWidth("600");headerRow.getCell(2).setWidth("600");headerRow.getCell(3).setWidth("600");headerRow.getCell(4).setWidth("600");headerRow.getCell(5).setWidth("600");headerRow.getCell(6).setWidth("600");headerRow.getCell(7).setWidth("600");headerRow.getCell(8).setWidth("600");headerRow.getCell(9).setWidth("600");headerRow.getCell(10).setWidth("600");// 创建表头的第二行XWPFTableRow headerRowTwo = table.createRow();headerRowTwo.getCell(4).setText("年计划");headerRowTwo.getCell(5).setText("月计划");headerRowTwo.getCell(6).setText("日完成量");headerRowTwo.getCell(7).setText("月完成量");headerRowTwo.getCell(8).setText("年完成量");headerRowTwo.getCell(9).setText("月度比例");headerRowTwo.getCell(10).setText("设计比例");headerRowTwo.getCell(0).setWidth("600");headerRowTwo.getCell(1).setWidth("600");headerRowTwo.getCell(2).setWidth("600");headerRowTwo.getCell(3).setWidth("600");headerRowTwo.getCell(4).setWidth("600");headerRowTwo.getCell(5).setWidth("600");headerRowTwo.getCell(6).setWidth("600");headerRowTwo.getCell(7).setWidth("600");headerRowTwo.getCell(8).setWidth("600");headerRowTwo.getCell(9).setWidth("600");headerRowTwo.getCell(10).setWidth("600");// 合并单元格this.fileMergeDay(table);//填入数据List<Map<String, Object>> attach = rateSunJlService.listInfSunAttachAll(time, ids);Map<String, List<Map<String, Object>>> groupedByTenantId = attach.stream().collect(Collectors.groupingBy(map -> map.get("simpleName").toString()));for (String simpleName : groupedByTenantId.keySet()) {List<Map<String, Object>> attachList = groupedByTenantId.get(simpleName);for (int i = 0; i < attachList.size(); i++) {XWPFTableRow dataRow = table.createRow();dataRow.getCell(0).setText(attach.get(i).get("simpleName").toString());dataRow.getCell(1).setText(attach.get(i).get("name").toString());dataRow.getCell(2).setText(attach.get(i).get("item") == null ? "" : attach.get(i).get("item").toString());dataRow.getCell(3).setText(attach.get(i).get("unit") == null ? "" : attach.get(i).get("unit").toString());dataRow.getCell(4).setText(attach.get(i).get("planMeasure") == null ? "" : attach.get(i).get("planMeasure").toString());dataRow.getCell(5).setText(attach.get(i).get("monthMeasure") == null ? "" : attach.get(i).get("monthMeasure").toString());dataRow.getCell(6).setText(attach.get(i).get("dayMeasure") == null ? "" : attach.get(i).get("dayMeasure").toString());dataRow.getCell(7).setText(attach.get(i).get("thisMonthQuantities") == null ? "" : attach.get(i).get("thisMonthQuantities").toString());dataRow.getCell(8).setText(attach.get(i).get("intactMeasure") == null ? "" : attach.get(i).get("intactMeasure").toString());dataRow.getCell(9).setText(attach.get(i).get("thisMonthScale") == null ? "" : attach.get(i).get("thisMonthScale").toString() + "%");dataRow.getCell(10).setText(attach.get(i).get("intactScale") == null ? "" : attach.get(i).get("intactScale").toString() + "%");dataRow.getCell(0).setWidth("600");dataRow.getCell(1).setWidth("600");dataRow.getCell(2).setWidth("600");dataRow.getCell(3).setWidth("600");dataRow.getCell(4).setWidth("600");dataRow.getCell(5).setWidth("600");dataRow.getCell(6).setWidth("600");dataRow.getCell(7).setWidth("600");dataRow.getCell(8).setWidth("600");dataRow.getCell(9).setWidth("600");dataRow.getCell(10).setWidth("600");}fileMergeDayH(table, rowsNum, attachList.size());rowsNum = rowsNum + attachList.size();}//设置表格居中对齐for (XWPFTableRow row : table.getRows()) {// 遍历每一行中的每个单元格for (XWPFTableCell cell : row.getTableCells()) {// 获取单元格的CTTc对象,用于设置对齐方式CTTc cttc = cell.getCTTc();CTTcPr ctTcPr = cttc.isSetTcPr() ? cttc.getTcPr() : cttc.addNewTcPr();// 设置垂直居中ctTcPr.addNewVAlign().setVal(STVerticalJc.CENTER);// 获取单元格中的段落XWPFParagraph paragraph = cell.getParagraphs().get(0);// 设置段落水平居中paragraph.setAlignment(ParagraphAlignment.CENTER);}}FileOutputStream out1 = new FileOutputStream(path);doc.write(out1);out1.close();doc.close();
涵盖的方法:
public void fileMergeDayH(XWPFTable table, int startRows, int length) {for (int i = 1; i < length + 1; i++) {if (i == 1) {table.getRow(startRows + i).getCell(0).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);} else {table.getRow(startRows + i).getCell(0).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}table.setTableAlignment(TableRowAlign.CENTER);}public void fileMergeDay(XWPFTable table) {//进行表头合并//横向合并,第一行的8-10table.getRow(0).getCell(4).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);table.getRow(0).getCell(5).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(4).getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf((600 * 1)));table.getRow(0).getCell(6).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);table.getRow(0).getCell(7).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(8).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(6).getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf((600 * 1)));table.getRow(0).getCell(9).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);table.getRow(0).getCell(10).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(9).getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf((600 * 1)));//竖向合并table.getRow(0).getCell(0).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);table.getRow(1).getCell(0).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(1).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);table.getRow(1).getCell(1).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(2).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);table.getRow(1).getCell(2).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);table.getRow(0).getCell(3).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);table.getRow(1).getCell(3).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);table.setTableAlignment(TableRowAlign.CENTER);}
附带转成pdf方法以及以流的形式导出
//将word文件转成pdfString pdfPath = file.getPath().substring(0, file.getPath().indexOf(".docx")) + ".pdf";File pdf = new File(pdfPath);ToPDFUtils.trans(path, pdfPath, ".docx");//将文件以文件流的形式传输InputStream inputStream = null;OutputStream outputStream = null;response.setContentType("application/json;charset=utf-8");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName=" + new String(pdf.getPath().getBytes("UTF-8"), "iso-8859-1"));inputStream = new BufferedInputStream(new FileInputStream(pdf.getPath()));outputStream = response.getOutputStream();byte[] buf = new byte[1024];int len;while ((len = inputStream.read(buf)) > 0) {outputStream.write(buf, 0, len);}response.flushBuffer();
package org.jeecg.modules.util;import com.aspose.cells.Font;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;import java.awt.image.BufferedImage;
import java.io.*;
import com.aspose.cells.*;
import org.aspectj.weaver.ast.Test;
import org.springframework.beans.factory.annotation.Value;import javax.imageio.ImageIO;
import java.awt.geom.Dimension2D;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class ToPDFUtils {private static List<String> list = new ArrayList<>();private static List<String> dellist = new ArrayList<>();public static String trans(String filePath, String pdfPath, String type) {try {toPdf(filePath, pdfPath, type);} catch (Exception e) {e.printStackTrace();}return pdfPath;}//转换private static void toPdf(String filePath, String pdfPath, String type) {if (".docx".equals(type) || ".doc".equals(type)) {word2PDF(filePath, pdfPath);}else if(".xls".equals(type) || ".xlsx".equals(type)){excel2PDF(filePath,pdfPath);} else if (".ppt".equals(type)) {ppt2PDF(filePath, pdfPath);}else{convert(filePath,pdfPath);}}private static void word2PDF(String inputFile, String pdfFile) {if (!getLicense()) {// 验证License 若不验证则转化出的pdf文档会有水印产生return;}try {long old = System.currentTimeMillis();File file = new File(pdfFile); //新建一个空白pdf文档FileOutputStream os = new FileOutputStream(file);com.aspose.words.Document doc = new com.aspose.words.Document(inputFile); //sourcerFile是将要被转化的word文档doc.save(os, com.aspose.words.SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换os.close();long now = System.currentTimeMillis();System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时} catch (Exception e) {e.printStackTrace();}}/*** 获取license** @return*/public static boolean getLicense() {boolean result = false;try {InputStream is = Test.class.getClassLoader().getResourceAsStream("\\license.xml");License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}public static void excel2PDF(String excelPath, String pdfPath) {long old = System.currentTimeMillis();// 验证Licenseif (!getLicense()) {return;}FileInputStream fileInputStream = null;FileOutputStream fileOutputStream = null;try {File excelFile = new File(excelPath);if (excelFile.exists()) {fileInputStream = new FileInputStream(excelFile);Workbook workbook = new Workbook(fileInputStream);Worksheet sheet = workbook.getWorksheets().get(0);sheet.getPageSetup().setPrintGridlines(true);File pdfFile = new File(pdfPath);PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();pdfSaveOptions.setOnePagePerSheet(true);//把内容放在一张PDF 页面上;//pdfSaveOptions.setOnePagePerSheet(false);//把内容放在一张PDF 页面上;FileOutputStream fileOS = new FileOutputStream(pdfFile);workbook.save(fileOS, pdfSaveOptions);// 只放一张纸;我的专为横向了long now = System.currentTimeMillis();} else {System.out.println("文件不存在");}} catch (Exception e) {e.printStackTrace();} finally {if (fileInputStream != null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}//图片转pdfpublic static void convert(String imagePath, String pdfPath) {try {BufferedImage img = ImageIO.read(new File(imagePath));FileOutputStream fos = new FileOutputStream(pdfPath);Document doc = new Document(null, 0, 0, 0, 0);doc.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));Image image = Image.getInstance(imagePath);PdfWriter.getInstance(doc, fos);doc.open();doc.add(image);doc.close();} catch (IOException e) {e.printStackTrace();} catch (BadElementException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}private static void ppt2PDF(String inputFile, String pdfFile) {ActiveXComponent app = new ActiveXComponent("PowerPoint.Application");try {Dispatch ppts = app.getProperty("Presentations").toDispatch();Dispatch ppt = Dispatch.call(ppts, "Open", new Object[]{inputFile, true, true, false}).toDispatch();Dispatch.call(ppt, "SaveAs", new Object[]{pdfFile, 32});Dispatch.call(ppt, "Close");app.invoke("Quit");} catch (Exception e) {e.printStackTrace();System.out.println("转换出错:" + inputFile);} finally {app.invoke("Quit");}}public static void delFile(List<String> filePaths) {for (String str : filePaths) {try {String filePath = str;filePath = filePath.toString();java.io.File myDelFile = new java.io.File(filePath);myDelFile.delete();} catch (Exception e) {System.out.println(str + "删除文件操作出错");e.printStackTrace();}}}// public static void setPageStyle(String savepath) {
//
// //创建PdfDocument实例
// PdfDocument originalDoc = new PdfDocument();
// //加载PDF文件
// originalDoc.loadFromFile(savepath);
//
// //创建一个新的PdfDocument实例
// PdfDocument newDoc = new PdfDocument();
// newDoc.getPages().add();
// //遍历所有PDF 页面
// //Dimension2D dimension2D = new Dimension();
//
// for (int i = 0; i < originalDoc.getPages().getCount(); i++) {
// PdfPageBase page = originalDoc.getPages().get(i);
// //获取页面旋转角度
// //int rotateAngle = page.getRotation().getValue();
// //判断pdf的纸张方向
// if ((page.getSize().getHeight()) < (page.getSize().getWidth())) {
// //旋转页面270度
// page.setRotation((PdfPageRotateAngle.fromValue(PdfPageRotateAngle.Rotate_Angle_270.getValue())));
//
// //设置新文档页边距为10
// PdfMargins margins = new PdfMargins(10);
// //设置新文档页面大小为A4
// PdfPageBase newPage = newDoc.getPages().add(PdfPageSize.A4, margins);
// //调整画布,设置内容也根据页面的大小进行缩放
// double wScale = (PdfPageSize.A4.getWidth() - 20) / page.getSize().getHeight();
// double hScale = (PdfPageSize.A4.getHeight() - 20) / page.getSize().getWidth();
// newPage.getCanvas().scaleTransform(wScale, hScale);
// //复制原文档的内容到新文档
// newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
// } else {
// //设置新文档页边距为10
// PdfMargins margins = new PdfMargins(10);
// //设置新文档页面大小为A4
// PdfPageBase newPage = newDoc.getPages().add(PdfPageSize.A4, margins);
// //调整画布,设置内容也根据页面的大小进行缩放
// double wScale = (PdfPageSize.A4.getWidth() - 20) / page.getSize().getWidth();
// double hScale = (PdfPageSize.A4.getHeight() - 20) / page.getSize().getHeight();
// newPage.getCanvas().scaleTransform(wScale, hScale);
// //复制原文档的内容到新文档
// newPage.getCanvas().drawTemplate(page.createTemplate(), new Point2D.Float());
// }
//
// }
// //保存PDF
// newDoc.saveToFile(savepath);
// newDoc.getPages().remove(newDoc.getPages().get(0));
// newDoc.saveToFile(savepath);
//
// PdfDocument pdf = newDoc;
// pdf.getPages().add();
// //创建字体
// PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.PLAIN, 10), true);
//
// //遍历文档中的页
// for (int i = 0; i < pdf.getPages().getCount(); i++) {
// Dimension2D pageSize = pdf.getPages().get(i).getSize();
// float y = (float) pageSize.getHeight() - 40;
// //初始化页码域
// PdfPageNumberField number = new PdfPageNumberField();
//
// //初始化总页数域
// PdfPageCountField count = new PdfPageCountField();
//
// //创建复合域
// PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.getBlack(), "第{0}页 共{1}页", number, count);
//
// //设置复合域内文字对齐方式
// compositeField.setStringFormat(new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top));
//
// //测量文字大小
// Dimension2D textSize = font.measureString(compositeField.getText());
//
// //设置复合域的在PDF页面上的位置及大小
// compositeField.setBounds(new Rectangle2D.Float(((float) pageSize.getWidth() - (float) textSize.getWidth()) / 2, y, (float) textSize.getWidth(), (float) textSize.getHeight()));
//
// //将复合域添加到PDF页面
// compositeField.draw(pdf.getPages().get(i).getCanvas());
// }
// //移除第一个页
// pdf.getPages().remove(pdf.getPages().get(pdf.getPages().getCount() - 1));
// //保存为另外一个文档
// pdf.saveToFile(savepath);
// }// public static boolean mergePdfFiles(String[] files, String newfile) {
// boolean retValue = false;
// Document document = null;
// try {
// document = new Document(new PdfReader(files[0]).getPageSize(1));
// PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));
// document.open();
// for (int i = 0; i < files.length; i++) {
// PdfReader reader = new PdfReader(files[i]);
// int n = reader.getNumberOfPages();
// for (int j = 1; j <= n; j++) {
// document.newPage();
// PdfImportedPage page = copy.getImportedPage(reader, j);
// copy.addPage(page);
// }
// }
// retValue = true;
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// document.close();
// }
// return retValue;
// }}
相关文章:
poi生成横向文档以及复杂表头
代码: //创建页面并且创建横向A4XWPFDocument doc new XWPFDocument();CTDocument1 document doc.getDocument();CTBody body document.getBody();if (!body.isSetSectPr()) {body.addNewSectPr();}CTSectPr section body.getSectPr();if (!section.isSetPgSz()) {section.…...
深入剖析TCP协议(内容二):从OSI与TCP/IP网络模型到三次握手、四次挥手、状态管理、性能优化及Linux内核源码实现的全面技术指南
文章目录 常见问题TCP和UDPISNUDPTCP数据可靠性TCP协议如何提高传输效率TCP如何处理拥塞 SocketTCP源码tcp_v4_connect()sys_accept()tcp_accept()三次握手客户端发送SYN段服务端发送SYN和ACK处理客户端回复确认ACK段服务端收到ACK段 常见问题 TCP和UDP TCP和UDP的区别&#…...
流程架构是什么?为什么要构建流程架构,以及如何构建流程结构?
本文从:流程架构是什么?为什么要构建流程架构?如何构建流程结构三个方面来介绍。 一、首先,我们来了解流程架构是什么? 流程架构是人体的骨架,是大楼的砌筑,是课本的目录,是流程管理…...
Visium HD多样本拼片拆分
Visium HD实验的时候一个捕获区域内可以包含多个样本拼片(例如多个组织切片或不同样本的排列)是常见的实验设计,多样本拼片能够提升实验效率,单张玻片处理多个样本,降低试剂和测序成本,后续分析的时候只需要…...
3DMAX零售商店生成插件RetailStore自定义贴图库方法详解
3DMAX零售商店生成插件——RetailStore,是一款兼具简洁性与复杂性的工具,专为通过样条线快速创建零售商店而设计。用户只需绘制一条街道廓线,轻点鼠标,即可生成一排随机的零售商店。该插件会在每个样条线段上自动生成一个店铺&…...
从性能到安全:大型网站系统架构演化的 13 个核心维度
大型网站系统架构的演化是一个复杂的过程,涉及到多个维度的技术内容,从关键维度进行详细分析: 1.性能维度 缓存技术:包括浏览器缓存、CDN(内容分发网络)缓存、服务器端缓存(如 Memcached、Red…...
昆仑万维开源SkyReels-V2,近屿智能紧跟AI技术趋势
昆仑万维 SkyReels 团队正式发布并开源全球首个采用扩散强迫框架的无限时长电影生成模型 SkyReels-V2,其通过融合多模态大语言模型、多阶段预训练、强化学习与扩散强迫框架实现协同优化,推动视频生成技术进入新阶段。该模型聚焦解决现有技术在提示词遵循…...
Milvus(4):创建 Collections
1 创建 Collections 可以通过定义 Schema、索引参数、度量类型以及创建时是否加载来创建一个 Collection。 1.1 集合概述 Collection 是一个二维表,具有固定的列和变化的行。每列代表一个字段,每行代表一个实体。要实现这样的结构化数据管理,…...
数据预处理:前缀和算法详解
数据预处理:前缀和算法详解 文章目录 数据预处理:前缀和算法详解1.算法原理2.算法作用3.C代码实现4.实战题目 1.算法原理 基本概念 前缀和(Prefix Sum)是一种常用的数据预处理技术,它可以快速求解区间和问题…...
盈达科技:登顶GEO优化全球制高点,以AICC定义AI时代内容智能优化新标杆
一、技术制高点——全球独创AICC系统架构,构建AI内容优化新范式 作为全球首个实现AI内容全链路优化的技术供应商,盈达科技凭借AICC智能协同中心(自适应内容改造、智能数据投喂、认知权重博弈、风险动态响应四大引擎)&#…...
【Linux】详细介绍进程的概念
目录 一、初识进程概念 真正的进程概念如下: 二、Linux中PCB的操作系统学科叫法:task_struct 1、简单认识task_ struct内容分类 2、问题:操作系统怎么知道当前程序执行到哪一行代码了? 三、linux关于进程的常用指令ÿ…...
mybatis框架补充
一,#{} 和${}区别 1.传数值 #{} 占位符,是经过预编译的,编译好SQL语句再取值,#方式能够防止sql注入 eg:#{}:delete from admin where id #{id} 结果: dalete from admin where id &#x…...
Alertmanager的安装和详细使用步骤总结
一、安装步骤 1. 二进制安装 下载与解压 从GitHub下载最新版本(如v0.23.0):wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz tar -xzf alertmanager-0.23.0.linux-amd6…...
C++学习:六个月从基础到就业——C++学习之旅:STL迭代器系统
C学习:六个月从基础到就业——C学习之旅:STL迭代器系统 本文是我C学习之旅系列的第二十四篇技术文章,也是第二阶段"C进阶特性"的第二篇,主要介绍C STL迭代器系统。查看完整系列目录了解更多内容。 引言 在上一篇文章中…...
缓存与数据库一致性方案
一、缓存更新策略概述 在现代分布式系统中,缓存作为数据库的前置层,能显著提升系统性能。然而,缓存与数据库之间的数据一致性是一个经典难题。以下是三种常见的缓存更新策略及其优缺点分析。 二、方案对比分析 方案一:直接更新…...
国内ip地址怎么改?详细教程
在中国,更改IP地址需要遵守规则,并确保所有操作合规。在特定情况下,可能需要修改IP地址以满足不同需求或解决特定问题。以下是一些常见且合法的IP地址变更方法及注意事项: 一、理解IP地址 IP地址是设备在网络中的唯一标识&#x…...
通过Quartus II实现Nios II编程
目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器,专门设计用于在FPGA上运行。作为软核处理器,Nios II可以通…...
拥抱基因体检,迎接精准健康管理新时代
2025年4月20日,由早筛网、细胞科技网联合中国食品药品企业质量安全促进会细胞医药分会、中国抗衰老促进会健康管理工作委员会、中国抗癌协会肿瘤分子医学专业委员会、广东省保健协会,伯温生物冠名支持的《基因体检赋能精准健康管理新时代》圆满召开。 伯…...
QT容器类控件及其属性
Group Box 使用QGroupBox实现一个带有标题的分组框,可以把其它的控件放到里面作为一组 例: 核心属性 属性 说明 title 分组框的标题 alignment 分组框内部内容的对齐方式 flat 是否”扁平模式” checkable 是否可选中 设为true,则…...
云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)
1、核心工具分类介绍 (1)、容器编排与管理 1、Docker 它是一款轻量级的容器化技术,可把应用及其依赖打包成独立的容器。借助Docker,开发者能够确保应用在不同环境中保持一致的运行状态。比如在开发环境中创建的容器,…...
网络基础知识
文章目录 一、网络架构1. 网络架构图2. 各层级功能3. 机房网络常见问题及解决方案 二、交换技术1. 交换技术基础2. 交换技术分类3. 广播域相关概念4. ARP 协议5. 三层交换机6. VLAN(虚拟局域网) 三、路由技术1. 路由器端口类型及功能2. 路由器功能3. 路由…...
第3课:运算符与流程控制——JS的“决策者”
一切美好都值得你全力以赴。即使过程艰难,但只要坚持,必有回响。加油! 欢迎来到「JavaScript 魔法学院」第 3 课!今天我们将化身代码世界的“指挥官”,用运算符计算数据,用流程控制做出决策!文…...
VUE3中使用echarts,配置都正确,不出现tooltip
在vue3中使用echarts,出现个别问题,需要注意echars对象的定义,不能使用reactive或者ref定义响应式变量,要使用shallowRef ; shallowRef 是 Vue 3 提供的一个 API,它创建一个响应式引用(ref),但…...
Python实现邮件发送
一、创造灵感 这几天在指导学生做毕业设计,学生做的是跌倒检测。然后我突然想到,如果这个系统只是单纯地从视频流中检测到人的跌倒动作,其实并没有任何的用途和意义。于是,我又想到,如果跌倒的检测结果,能…...
OSPF的优化
OSPF的优化 1、汇总 --- 减少骨干区域LSA的更新量 汇总 --- 区域汇总 域间路由汇总 --- 在ABR设备上,针对3类LSA进行汇总 [r1-ospf-1-area-0.0.0.2]abr-summary 192.168.0.0 255.255.252.0 注:在进行域间路由汇总时,必须是ABR设备自己通过拓…...
IP-guard离线卸载客户端及清除策略说明
1、控制台生成客户端工具 控制台选择“工具-客户端工具-客户端离线辅助工具”,可生成客户端离线卸载工具及 离线策略清除工具,打包生成exe后,可在离线的客户端上运行,实现离线情况下对客户端 进行卸载或者清除策略。 在控制台上“…...
腾讯秋招面试题:bug生命周期中有哪些状态?
在软件测试中,Bug生命周期是质量管控的核心脉络。不同企业的流程或有差异,但核心状态遵循行业通用规范。以下以腾讯TAPD缺陷管理模型为基础,结合互联网大厂主流实践,详解Bug生命周期的关键状态及流转逻辑。 一、基础状态图谱 图表 代码 下载 确认有效 非缺陷/需求不符…...
PyCharm 链接 Podman Desktop 的 podman-machine-default Linux 虚拟环境
#工作记录 PyCharm Community 连接到Podman Desktop 的 podman-machine-default Linux 虚拟环境详细步骤 1. 准备工作 确保我们已在 Windows 系统中正确安装并启动了 Podman Desktop。 我们将通过 Podman Desktop 提供的名为 podman-machine-default 的 Fedora Linux 41 WSL…...
学习海康VisionMaster之卡尺工具
一:进一步学习了 今天学习下VisionMaster中的卡尺工具:主要用于测量物体的宽度、边缘的特征的位置以及图像中边缘对的位置和间距 二:开始学习 1:什么是卡尺工具? 如果我需要检测芯片的每一个PIN的宽度和坐标ÿ…...
私有知识库 Coco AI 实战(二):摄入 MongoDB 数据
在之前的文章中,我们介绍过如何使用《 Logstash 迁移 MongoDB 数据到 Easyseach》,既然 Coco AI 后台数据存储也使用 Easysearch,我们能否直接把 MongoDB 的数据迁移到 Coco AI 的 Easysearch,使用 Coco AI 对数据进行检索呢&…...
【C/C++】插件机制:基于工厂函数的动态插件加载
本文介绍了如何通过 C 的 工厂函数、动态库(.so 文件)和 dlopen / dlsym 实现插件机制。这个机制允许程序在运行时动态加载和调用插件,而无需在编译时知道插件的具体类型。 一、 动态插件机制 在现代 C 中,插件机制广泛应用于需要…...
硬核科普丨2025年安全、高效网络准入控制系统深度解析
阳途网络准入控制系统(Network Access Control,简称NAC)是当代网络安全领域的重要工具,有效防止未经授权的访问和数据泄露,保障网络资源的安全性和完整性。本文将深入探讨阳途网络准入控制系统的的重要性和作用。 一、…...
2025知识管理趋势解析:AI、协作与用户体验引领变革
知识管理软件是多元化的商业工具,包括知识库系统、wiki、协作平台、文档管理工具、聊天机器人和帮助系统,针对企业信息爆炸式增长的趋势,这些工具正逐步成为提升知识工作者效率和客户服务水平的关键支撑。 知识成为新资产:知识工…...
杂谈-有感而发
今天又拜读了线性代数的几何意义这本书,感觉确实是很不错的,从几何角度讲解线性代数,而且将线性代数、几何、数学、物理有机结合起来了,不仅仅是可视化,重要的是能便于自己独立思考下去。 从大一开始,就…...
使用nodeJs的express+axios+cors做代理
使用nodeJs的expressaxioscors做代理 前端在请求后端时通常会遇到跨域cors问题,如果只在本地开发可以通过webpack或vite的proxy设置。但如果需要在线上或者其他地方绕过跨域,可以使用代理的方法。 1. 创建文件夹 并创建以下文件 package.json {"…...
SQL进阶知识:四、索引优化
今天介绍下关于索引优化的详细介绍,并结合MySQL数据库提供实际例子。 索引优化是数据库性能优化的关键环节之一,尤其是在处理大量数据时。索引可以加快查询速度,减少数据扫描范围,但不当的索引设计也可能导致性能问题。以下是关于…...
C++初阶-类和对象(下)
目录 1.再探构造函数 2.类型转换 3.友元 4.static成员 5.内部类 6.匿名对象 *7.对象拷贝时的编译器优化(非必学) 8.总结 1.再探构造函数 (1)之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值&#…...
RPC通信原理实战
RPC概念及RPC请求响应流程 RPC概念引入 假设有两个模块,用户和订单 在单体项目中,两个模块被打包到一个包,都处在一个tomcat进程中,用户模块调用订单模块属于同一进程内的本地调用 在微服务项目中,用户模块和订单模…...
自动创建 中国古代故事人物一致性图画,看看扣子的空间是否能达到你的满意,自媒体的福音?
欢迎来到涛涛聊AI 看效果: AI绘画最难的人物一致性问题,每次得到的结果都不一致。 官方介绍: 扣子空间是你和 AI Agent 协同办公的最佳场所。 在扣子空间里,精通各项技能的「通用实习生」,各行各业的「领域专家」&…...
【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现
摘要: 本文介绍了如何在 Unity 中构建一个高效的音效管理系统,通过 ScriptableObject 实现音效集中配置,支持为每个音效单独设置音量,并通过自定义 Editor 实现音效的可视化预览播放与下拉选择播放功能,整个系统无场景…...
面向高可靠场景的RISC-V低功耗MCU硬件安全设计
该RISC-V架构的低功耗MCU通过多项硬件级安全技术满足工业控制、汽车电子及物联网等领域对可靠性与安全性的需求。其核心特性包含六个方面: 在数据完整性验证与固件安全升级方面,该MCU通过硬件级校验机制(如CRC、哈希算法)确保固件…...
OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测
目录 实现讲解效果展示完整代码 本文作为上篇博客的延续,在之前实现了图片推理的基础上,进一步介绍如何进行视频推理。 实现讲解 首先,我们需要对之前的 predict_and_show_image 函数进行拆分,将图像显示与推理器(pre…...
【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
DP读书:新能源科学与工程——专业课「新能源发电系统」 2025a 版本 MATLAB下面进入正题 仿真一:Buck 电路一、仿真目的二、仿真内容(一)Buck电路基本构成及工作原理(二)Buck电路仿真模型及元件连接…...
软件项目实施全流程及交付物清单
需求分析 -> 概要设计 -> 详细设计 -> 开发 -> 测试 -> 部署 -> 上线运行 一、确认项目目标、范围和团队成员 二、收集和分析客户需求,确定需求规格 三、制定详细的项目计划,包括时间表、资源计划、预算 四、系统架构设计…...
Docker安装ES :确保 Kibana 正确连接 Elasticsearch
在使用 Docker 部署 ELK(Elasticsearch、Logstash、Kibana)堆栈时,正确的服务配置和依赖管理至关重要。本文将分享如何优化 Docker Compose 配置,确保 Kibana 能稳定连接到 Elasticsearch,并提供故障排查建议 cd /opt/…...
云贝餐饮 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开
云贝餐饮源码 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开 vue uniapp 独家优化版本 后台管理 Vue 源文件 后台管理文件 yii2 升级包 (全开源) 收银台 Vue 源文件 装修 Vue 源文件 商家端 uni-app 源文件 用户端 uni-app 源文件 数据库文件 云贝餐饮…...
python异步协程async调用过程图解
1.背景: 项目中有用到协程,但是对于协程,线程,进程的区别还不是特别了解,所以用图示的方式画了出来,用于理清三者的概念。 2.概念理解: 2.1协程,线程,进程包含关系 一…...
【Java学习笔记】选择结构
选择结构 内容结构 一、顺序结构 二、分支控制 (1)单分支 (2)双分支 (3)多分支 (4)嵌套分支 (5)switch 分支结构 三、switch和if的比较 一、顺序结构…...
java Nacos
windows下载nacos,版本2.x的,1.0的话会出现“Server check fail, please check server 127.0.0.1 ,port 9848 is available , error {}” 这个鬼问题 下载链接 这里用的是2.0.4版本,启动的话用 startup.cmd -m standalone,单体启…...
c语言之杂识
前言 主要说一下c语言的杂知识 一、预处理指令 1. #include #include指令用于包含其他头文件的内容到当前文件中。这允许您在程序中使用其他模块定义的函数和变量。 示例: #include <stdio.h> // 包含标准输入输出头文件int main() {printf("Hello…...