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
英文地址,請注明出處:http://en.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等包管理器來完成這一任務。下面將詳細介紹兩…