Java 导出word 实现饼状图导出--可编辑数据

📊 支持图表导出功能!

支持将 柱状图折线图 图表以 Word 文档格式导出,并保留图例、坐标轴、颜色、数据标签等完整信息。

如需使用该功能,请私聊我,备注 “导出柱状图 / 折线图”

生成的效果图如下:

在这里插入图片描述

示例调用方式

package com.gemantic.qflow.word.utils;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;/*** 饼图渲染工具类:用于在Word文档中生成饼图。* 支持自定义颜色、图例位置、数据标签显示等参数。* 当单个数据点包含多个值时,自动取第一个值作为饼图数据。*/
public class PieChartRenderer {/*** 测试主方法,直接运行可生成示例Word文档并导出到本地。* @param args 命令行参数* @throws IOException 文件写入异常* @throws InvalidFormatException 图表格式异常*/public static void main(String[] args) throws IOException, InvalidFormatException {// 使用用户提供的JSON数据结构进行测试String jsonData = "{\n" +"    \"type\": \"chart_pie\",\n" +"    \"chartType\": \"pie\",\n" +"    \"title\": \"股价对比图表\",\n" +"    \"xAxisTitle\": \"日期\",\n" +"    \"yAxisTitle\": \"价格\",\n" +"    \"legend\": [],\n" +"    \"value\": [\n" +"        { \"name\": \"2022/11/12\", \"value\": [120.99,2000] },\n" +"        { \"name\": \"2022/11/13\", \"value\": [null] },\n" +"        { \"name\": \"2022/11/14\", \"value\": [150] },\n" +"        { \"name\": \"2022/11/15\", \"value\": [160] },\n" +"        { \"name\": \"2022/11/16\", \"value\": [180] }\n" +"    ],\n" +"    \"colors\": [\n" +"        \"#4E79A7\",\n" +"        \"#29A0CA\"\n" +"    ],\n" +"    \"showTitle\": true,\n" +"    \"showGrid\": true,\n" +"    \"showLegend\": true,\n" +"    \"showAxisLabel\": true,\n" +"    \"showDataLabel\": true,\n" +"    \"showAxis\": true,\n" +"    \"width\": 600,\n" +"    \"height\": 400\n" +"}";new PieChartRenderer().renderFromJson(new XWPFDocument(), jsonData);}/*** 基于JSON字符串渲染饼图到Word文档* @param doc 目标XWPFDocument文档对象* @param jsonData JSON字符串,包含饼图配置和数据* @throws IOException 文件写入异常* @throws InvalidFormatException 图表格式异常*/public void renderFromJson(XWPFDocument doc, String jsonData) throws IOException, InvalidFormatException {ObjectMapper mapper = new ObjectMapper();JsonNode rootNode = mapper.readTree(jsonData);// 解析基本配置String chartType = rootNode.get("chartType").asText(); // 应该是 "pie"String title = rootNode.get("title").asText();// 【图表标题】是否显示图表主标题。true:显示。false:不显示。boolean showTitle = rootNode.get("showTitle").asBoolean();// 【图例】是否显示图例。boolean showLegend = rootNode.get("showLegend").asBoolean();// 【数据标签】是否在图表上直接显示每个数据点的数值标签。true:显示。false:不显示。boolean showDataLabel = rootNode.get("showDataLabel").asBoolean();// 饼图的尺寸配置int width = rootNode.has("width") ? rootNode.get("width").asInt() : 600;int height = rootNode.has("height") ? rootNode.get("height").asInt() : 400;// 解析颜色配置List<String> colors = new ArrayList<>();JsonNode colorsNode = rootNode.get("colors");if (colorsNode != null) {for (JsonNode color : colorsNode) {colors.add(color.asText());}}// 解析饼图数据JsonNode valueNode = rootNode.get("value");List<String> categories = new ArrayList<>();List<Double> values = new ArrayList<>();// 解析每个数据点,如果有多个值则取第一个,过滤掉null或无效值for (JsonNode dataPoint : valueNode) {String name = dataPoint.get("name").asText();JsonNode valueArray = dataPoint.get("value");Double validValue = null;if (valueArray.isArray() && valueArray.size() > 0) {// 遍历值数组,找到第一个有效的非null数值for (int i = 0; i < valueArray.size(); i++) {JsonNode valueNode2 = valueArray.get(i);if (!valueNode2.isNull() && valueNode2.isNumber()) {double val = valueNode2.asDouble();// 只接受大于0的有效值(饼图不能有负值或0值)if (val > 0) {validValue = val;break;}}}}// 只添加有有效值的数据点到饼图中if (validValue != null) {categories.add(name);values.add(validValue);System.out.println("✅ 添加饼图数据点:" + name + " = " + validValue);} else {System.out.println("⚠️ 跳过无效数据点:" + name + "(值为null、0或负数)");}}// 转换为数组String[] categoryArray = categories.toArray(new String[0]);Double[] valueArray = values.toArray(new Double[0]);// 创建饼图createPieChart(doc, title, categoryArray, valueArray, colors,showDataLabel, showTitle, showLegend, width, height);// 保存文件String outputPath = "/Users/wtm/Desktop/output/pie_chart_" + System.currentTimeMillis() + ".docx";try (FileOutputStream out = new FileOutputStream(outputPath)) {doc.write(out);}System.out.println("✅ 饼图导出完成,路径:" + outputPath);}/*** 创建饼图的核心方法* @param doc 目标XWPFDocument文档对象* @param chartTitle 图表标题* @param categories 饼图分类标签数组* @param values 饼图数值数组* @param colors 颜色列表* @param showDataLabels 是否显示数据标签* @param showTitle 是否显示图表标题* @param showLegend 是否显示图例* @param width 图表宽度(像素)* @param height 图表高度(像素)* @throws IOException 文件写入异常* @throws InvalidFormatException 图表格式异常*/private void createPieChart(XWPFDocument doc,String chartTitle,String[] categories,Double[] values,List<String> colors,boolean showDataLabels,boolean showTitle,boolean showLegend,int width,int height) throws IOException, InvalidFormatException {// 创建段落标题XWPFParagraph p = doc.createParagraph();p.setAlignment(ParagraphAlignment.CENTER);XWPFRun r = p.createRun();r.setText(chartTitle);r.setBold(true);r.setFontSize(16);// 创建图表对象 - 使用JSON提供的尺寸,转换为EMU单位int widthEMU = (int) (width * Units.EMU_PER_PIXEL);int heightEMU = (int) (height * Units.EMU_PER_PIXEL);XWPFChart chart = doc.createChart(widthEMU, heightEMU);// 首先填充嵌入的Excel数据,确保数据源正确建立populateEmbeddedExcelDataForPie(chart, categories, values);// 设置图表标题显示/隐藏if (showTitle) {chart.setTitleText(chartTitle);chart.setTitleOverlay(false);} else {// 隐藏图表标题chart.setTitleText("");chart.setTitleOverlay(true);}// 设置图例显示/隐藏if (showLegend) {XDDFChartLegend legend = chart.getOrAddLegend();legend.setPosition(LegendPosition.BOTTOM); // 【修改】图例位置设置为底部} else {// 隐藏图例if (chart.getCTChart().isSetLegend()) {chart.getCTChart().unsetLegend();}}// 使用Excel工作表数据作为数据源XDDFCategoryDataSource categoryDataSource = createCategoryDataSourceFromExcelForPie(chart, categories.length);XDDFNumericalDataSource<Double> valuesDataSource = createNumericalDataSourceFromExcelForPie(chart, categories.length);// 创建饼图数据XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null);// 添加饼图系列XDDFPieChartData.Series series = (XDDFPieChartData.Series) data.addSeries(categoryDataSource, valuesDataSource);series.setTitle("饼图数据", null);// 设置数据标签setPieDataLabels(series, showDataLabels, values);// 设置饼图扇形颜色setPieSeriesColors(series, colors, categories.length);// 绘制图表chart.plot(data);System.out.println("✅ 饼图创建完成,包含 " + categories.length + " 个扇形");}/*** 填充嵌入的Excel数据,专门为饼图设计* @param chart XWPFChart对象* @param categories 饼图分类标签* @param values 饼图数值*/private void populateEmbeddedExcelDataForPie(XWPFChart chart, String[] categories, Double[] values) {try {// 获取嵌入的Excel工作簿if (chart.getWorkbook() != null) {org.apache.poi.ss.usermodel.Workbook workbook = chart.getWorkbook();// 获取第一个工作表,如果不存在则创建org.apache.poi.ss.usermodel.Sheet sheet = workbook.getNumberOfSheets() > 0 ?workbook.getSheetAt(0) : workbook.createSheet("PieChartData");// 设置工作表名称if (workbook.getNumberOfSheets() > 0) {workbook.setSheetName(0, "PieChartData");}// 清空现有数据for (int i = sheet.getLastRowNum(); i >= 0; i--) {org.apache.poi.ss.usermodel.Row row = sheet.getRow(i);if (row != null) {sheet.removeRow(row);}}// 创建表头行org.apache.poi.ss.usermodel.Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("分类"); // 第一列为分类标题headerRow.createCell(1).setCellValue("数值"); // 第二列为数值标题// 填充数据行for (int i = 0; i < categories.length && i < values.length; i++) {org.apache.poi.ss.usermodel.Row dataRow = sheet.createRow(i + 1);dataRow.createCell(0).setCellValue(categories[i]);dataRow.createCell(1).setCellValue(values[i] != null ? values[i] : 0.0);}// 自动调整列宽sheet.autoSizeColumn(0);sheet.autoSizeColumn(1);// 设置数据区域名称,便于图表引用org.apache.poi.ss.usermodel.Name dataRange = workbook.createName();dataRange.setNameName("PieChartDataRange");String rangeFormula = "PieChartData!$A$1:$B$" + (categories.length + 1);dataRange.setRefersToFormula(rangeFormula);System.out.println("✅ 已填充饼图嵌入Excel数据,包含 " + (categories.length + 1) + " 行 2 列");System.out.println("✅ 饼图数据范围设置为:" + rangeFormula);}} catch (Exception e) {System.err.println("警告:填充饼图嵌入Excel数据时出错:" + e.getMessage());e.printStackTrace();}}/*** 从Excel工作表创建分类数据源(专门为饼图设计)* @param chart XWPFChart对象* @param categoryCount 分类数量* @return 分类数据源*/private XDDFCategoryDataSource createCategoryDataSourceFromExcelForPie(XWPFChart chart, int categoryCount) {try {// 创建引用Excel第一列的数据源(A2:A[n],跳过标题行)return XDDFDataSourcesFactory.fromStringCellRange(chart.getWorkbook().getSheetAt(0),new org.apache.poi.ss.util.CellRangeAddress(1, categoryCount, 0, 0));} catch (Exception e) {System.err.println("警告:无法创建饼图Excel分类数据源,使用默认数据源:" + e.getMessage());// 如果失败,返回默认的字符串数组数据源String[] defaultCategories = new String[categoryCount];for (int i = 0; i < categoryCount; i++) {defaultCategories[i] = "分类" + (i + 1);}return XDDFDataSourcesFactory.fromArray(defaultCategories);}}/*** 从Excel工作表创建数值数据源(专门为饼图设计)* @param chart XWPFChart对象* @param dataCount 数据行数* @return 数值数据源*/private XDDFNumericalDataSource<Double> createNumericalDataSourceFromExcelForPie(XWPFChart chart, int dataCount) {try {// 创建引用Excel第二列的数据源(B2:B[n],跳过标题行)return XDDFDataSourcesFactory.fromNumericCellRange(chart.getWorkbook().getSheetAt(0),new org.apache.poi.ss.util.CellRangeAddress(1, dataCount, 1, 1));} catch (Exception e) {System.err.println("警告:无法创建饼图Excel数值数据源,使用默认数据源:" + e.getMessage());// 如果失败,返回默认的数值数组数据源Double[] defaultData = new Double[dataCount];for (int i = 0; i < dataCount; i++) {defaultData[i] = (double) (i + 1) * 10; // 简单的递增数据}return XDDFDataSourcesFactory.fromArray(defaultData);}}/*** 设置饼图数据标签* @param series 饼图系列* @param showDataLabels 是否显示数据标签* @param values 数值数组(用于确定哪些点需要标签)*/private void setPieDataLabels(XDDFPieChartData.Series series, boolean showDataLabels, Double[] values) {if (!showDataLabels) {// 关闭所有标签CTPieSer ctSer = series.getCTPieSer();if (ctSer.isSetDLbls()) {ctSer.unsetDLbls();}return;}try {// 为饼图显示数据标签CTPieSer ctSer = series.getCTPieSer();CTDLbls dLbls = ctSer.isSetDLbls() ? ctSer.getDLbls() : ctSer.addNewDLbls();// 清空原有标签dLbls.setDLblArray(null);// 全局标签设置:显示数值dLbls.addNewShowVal().setVal(true);dLbls.addNewShowLegendKey().setVal(false);dLbls.addNewShowCatName().setVal(false);dLbls.addNewShowSerName().setVal(false);dLbls.addNewShowPercent().setVal(false);dLbls.addNewShowLeaderLines().setVal(true); // 饼图特有:显示引导线// 为每个有值的数据点设置标签for (int i = 0; i < values.length; i++) {if (values[i] != null && values[i] > 0) {org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbl lbl = dLbls.addNewDLbl();lbl.addNewIdx().setVal(i);lbl.addNewShowVal().setVal(true);lbl.addNewShowLegendKey().setVal(false);lbl.addNewShowCatName().setVal(false);lbl.addNewShowSerName().setVal(false);lbl.addNewShowPercent().setVal(false);}}System.out.println("✅ 已设置饼图数据标签,显示 " + values.length + " 个数据点的标签");} catch (Exception e) {System.err.println("警告:设置饼图数据标签时出错:" + e.getMessage());}}/*** 设置饼图扇形颜色* @param series 饼图系列* @param colors 颜色列表* @param pointCount 数据点数量*/private void setPieSeriesColors(XDDFPieChartData.Series series, List<String> colors, int pointCount) {if (colors == null || colors.isEmpty()) {System.out.println("⚠️ 未提供颜色配置,将使用默认颜色");return;}try {// 为每个饼图扇形设置颜色for (int i = 0; i < pointCount; i++) {// 使用模运算实现颜色循环:当颜色数量少于数据点时循环使用String colorHex = colors.get(i % colors.size());setPieSliceColor(series, i, colorHex);}System.out.println("✅ 已设置饼图扇形颜色,使用 " + colors.size() + " 种颜色为 " + pointCount + " 个扇形着色");} catch (Exception e) {System.err.println("警告:设置饼图颜色时出错:" + e.getMessage());}}/*** 设置单个饼图扇形的颜色* @param series 饼图系列* @param pointIndex 数据点索引* @param colorHex 十六进制颜色值(如 #4E79A7)*/private void setPieSliceColor(XDDFPieChartData.Series series, int pointIndex, String colorHex) {try {// 移除颜色字符串前的#号String hex = colorHex.startsWith("#") ? colorHex.substring(1) : colorHex;// 将十六进制颜色转换为RGBint r = Integer.parseInt(hex.substring(0, 2), 16);int g = Integer.parseInt(hex.substring(2, 4), 16);int b = Integer.parseInt(hex.substring(4, 6), 16);// 创建颜色对象XDDFColor xddfColor = XDDFColor.from(new byte[]{(byte)r, (byte)g, (byte)b});XDDFSolidFillProperties fillProperties = new XDDFSolidFillProperties(xddfColor);// 设置饼图扇形颜色XDDFShapeProperties shapeProperties = new XDDFShapeProperties();shapeProperties.setFillProperties(fillProperties);// 通过底层CT对象设置特定数据点的颜色CTPieSer ctSer = series.getCTPieSer();if (ctSer.getDPtArray().length <= pointIndex) {// 如果数据点不存在,创建新的数据点while (ctSer.getDPtArray().length <= pointIndex) {org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt dPt = ctSer.addNewDPt();dPt.addNewIdx().setVal(ctSer.getDPtArray().length - 1);}}org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt dPt = ctSer.getDPtArray(pointIndex);if (dPt == null) {dPt = ctSer.addNewDPt();dPt.addNewIdx().setVal(pointIndex);}// 设置数据点的填充属性if (!dPt.isSetSpPr()) {dPt.addNewSpPr();}if (!dPt.getSpPr().isSetSolidFill()) {dPt.getSpPr().addNewSolidFill();}if (!dPt.getSpPr().getSolidFill().isSetSrgbClr()) {dPt.getSpPr().getSolidFill().addNewSrgbClr();}// 设置RGB颜色值dPt.getSpPr().getSolidFill().getSrgbClr().setVal(new byte[]{(byte)r, (byte)g, (byte)b});} catch (Exception e) {// 如果颜色格式错误,记录错误但不中断流程System.err.println("警告:无法解析颜色 " + colorHex + " 用于数据点 " + pointIndex + ",将使用默认颜色。错误:" + e.getMessage());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90508.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型平台

在科技浪潮迅猛推进的当下&#xff0c;AI大模型平台宛如一颗璀璨的新星&#xff0c;强势闯入大众视野&#xff0c;以其独特的魅力和强大的功能&#xff0c;深刻地变革着我们生活与工作的每一处角落。从日常智能助手的贴心陪伴&#xff0c;到专业内容创作的灵感激发&#xff1b;…

C# Console App生成的 dll文件

在使用 dotnet 8.0 创建一个 C# console app后&#xff0c;执行完编译操作&#xff0c;会发现除了生成可执行文件外&#xff0c;还生成一个 dll文件。 $ls ConsoleApp1 ConsoleApp1.dll ConsoleApp1.runtimeconfig.json ConsoleApp1.deps.json ConsoleApp1.pdb $ …

【AI】环境——深度学习cuda+pytorch配置

文章目录关键组件及关系显卡驱动GPU DriverCUDACUDA ToolkitcuDNNPytorch各组件版本选择驱动程序CUDA查看驱动及CUDA的最大支持版本CUDA Toolkit选自定义安装检验无法识别nvcccuDNNcondapip换源conda管理py包conda 换源查看列表、创建、克隆、激活、删除conda包管理包安装原则设…

观众信息设置与统计(视频高级分析与统计功能)

Web播放器&#xff08;POLYV-html5-player&#xff09;支持设置观众信息参数&#xff0c;设置后在播放器上报的观看日志中会附带观众信息&#xff0c;这样用户就可以通过管理后台的统计页面或服务端API来查看特定观众的视频观看情况了。 一、观众信息设置 播放器设置观众信息参…

《数据库》 MySQL库表操作

1. SQL语句基础 1.2 SQL简介 SQL&#xff1a;结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句&#xff0c;程序员和数据库管理员可以完成如下的任务 改变数据库的结构 更改系统的安全设置…

DSP的基础平台搭建

1、CCS6.0的安装安装步骤这里就不说了&#xff0c;只谈论最可能遇到的问题&#xff1a;可以看到为需要关闭防火墙和扫描&#xff1b;在这里将其都关闭&#xff0c;然后可以断掉网络&#xff0c;关闭联想管家&#xff0c;可能还是会出现防火墙提示&#xff0c;但是可以安装&…

下一代防火墙-终端安全防护

实验设备1、 山石网科&#xff08;hillstone&#xff09;系列下一代防火墙&#xff08;实训平台v1.0中hillstone设备&#xff09;2、 三层交换机一台&#xff08;实训平台v1.0中cisco vios l2设备&#xff09;3、 二层交换机一台&#xff08;实训平台v1.0中cisco iol switch设备…

Scala实现网页数据采集示例

Scala 可以轻松实现简单的数据采集任务&#xff0c;结合 Akka HTTP&#xff08;高效HTTP客户端&#xff09;和 Jsoup&#xff08;HTML解析库&#xff09;是常见方案。Scala因为受众比较少&#xff0c;而且随着这两年python的热门语言&#xff0c;更让Scala不为人知&#xff0c;…

【IO复用】五种IO模型

文章目录五种IO模型Linux设计哲学BIONIOAIOSIOIO多路复用五种IO模型 Linux设计哲学 在linux系统中&#xff0c;实际上所有的I/O设备都被抽象为了文件这个概念&#xff0c;一切皆文件&#xff0c;磁盘、网络数据、终端&#xff0c;甚至进程间通信工具管道pipe等都被当做文件对…

FeatherScan v4.0 – 适用于Linux的全自动内网信息收集工具

前言 在平时渗透打靶的时候&#xff0c;经常要自己手工输入命令&#xff0c;做各种基本的信息收集&#xff0c;非常的繁琐&#xff0c;所以自研了一款工具&#xff0c;这款工具没有接入AI&#xff0c;因为不合适&#xff0c;接入了AI的话在一些不能上网的环境下进行信息收集&a…

如何精准筛选优质SEO服务资源?

核心要点&#xff1a; 中小企业选择SEO服务常陷困惑——效果难量化、承诺不透明、策略模糊化。本文剖析核心痛点&#xff0c;拆解技术合规性、策略透明度、行业经验匹配度等关键筛选维度&#xff0c;提供一套清晰的评估路径&#xff0c;助您在复杂市场中找到真正专业的合作伙伴…

在教育领域中,如何通过用户ID跑马灯来对视频进行加密?

文章目录前言一、什么是用户跑马灯二、用代码如何实现用户ID跑马灯的功能三、如何通过用户ID跑马灯来对视频进行加密&#xff1f;总结前言 在教育领域&#xff0c;优质视频课程易遭非法传播。为强化版权保护与责任追溯&#xff0c;引入基于用户ID的跑马灯水印技术成为有效手段…

MCP协议:AI时代的“万能插座”如何重构IT生态与未来

MCP协议&#xff1a;AI时代的“万能插座”如何重构IT生态与未来 在人工智能技术爆炸式发展的浪潮中&#xff0c;一个名为Model Context Protocol&#xff08;MCP&#xff09; 的技术协议正以惊人的速度重塑IT行业的底层逻辑。2024年11月由Anthropic首次发布&#xff0c;MCP在短…

同步,异步复位问题

1.同步复位的基本原理是&#xff0c;复位信号仅在时钟的有效边沿影响或重置触发器的状态。复位的主要目标之一是使 ASIC 在仿真时进入已知状态。由于复位树的扇出较大&#xff0c;复位信号相对于时钟周期可能成为 “晚到信号”。即使复位信号会通过复位缓冲树进行缓冲&#xff…

数组和指针回顾,练习与解析

代码见&#xff1a;登录 - Gitee.com 1.数组和指针练习与解析 1.1数组名 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。 2.&数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址。 3.除此之…

【牛客刷题】活动安排

文章目录一、题目介绍二、解题思路2.1 核心问题2.2 贪心策略2.3 正确性证明三、算法分析3.1 为什么按结束时间排序&#xff1f;3.2 复杂度分析3.3 算法流程图解3.3.1 流程图说明3.3.2 关键步骤说明四、模拟演练五、完整代码一、题目介绍 活动安排 题目描述 给定 nnn 个活动&am…

第1讲:C语言常见概念

目录 一、什么是C语言&#xff1f; 二、C语言的历史与成就 三、编译器选择&#xff08;VS2022&#xff09; 1、编译与链接 2、编译器对比 3、VS2022的优缺点 四、VS项目与源文件、头文件介绍 五、第一个C语言程序 六、main函数 七、printf和库函数 八、关键字介绍 …

WinUI3入门18:从APP打开商店链接以及实现内购

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

BI布局拖拽 (1) 深入react-gird-layout源码

因为有个拖拉拽的需求&#xff0c;类似于quickBi那样的效果。在网上调研了一下发现react-grid-layout实现效果类似&#xff0c;但其也有局限性&#xff0c;比如不支持嵌套&#xff0c;不支持在多个gridLyaout之间互相拖拽。 要求&#xff1a;基于react-grid-layout的思路&#…

CentOS环境搭建-快速升级G++版本

在CentOS环境中快速升级G编译器版本&#xff0c;对于追求最新语言特性的开发者来说至关重要。由于CentOS默认的软件仓库可能不提供G的最新版本&#xff0c;我们通常需要借助第三方软件源&#xff0c;如Developer Toolset或使用Spack等包管理器来完成这一任务。下面将详细介绍两…