实现vue导出excel和echart图形分别在不同工作表

news2025/1/18 14:49:12

背景

实现一键导出excel
并且区分图表和表格为不同的sheet工作表
最终效果为
在这里插入图片描述

代码实现

功能实现


  
  <script lang="ts">
  import * as echarts from 'echarts';
  import ExcelJS from 'exceljs';
  import { saveAs } from 'file-saver';
import {getAsyncTempCurrentData} from '../../../api/fenxi'
import {  toRefs } from 'vue'
import FileSaver from "file-saver";
import * as XLSX from 'xlsx'
import { ref, reactive, onMounted ,getCurrentInstance,nextTick } from 'vue'


  export default {
    data() {
        const state = reactive({
    tableData: [] as any, // 表格数据
    dialog: false, // 模态框显示、隐藏
    name: '' // 自定义文件名
})

// const tableData = ref(); 
const { tableData, dialog, name } = toRefs(state)
      return {

        chart: null,
        tableData
      };
    },
    mounted() {
  
      this.chart = echarts.init(this.$refs.chart);
      this.fetchData();
      
    },
    methods: {
      fetchData() {
        getAsyncTempCurrentData().then((response) => {
          console.log(response);
            this.tableData = response.data; 
          const years = response.data.map((item) => item.year + '年' + item.month + '月');
          const charges = response.data.map((item) => item.charge);
          const discharges = response.data.map((item) => item.discharge);
          const temps = response.data.map((item) => item.temp);
  
          const  option = {
            
          textStyle:{
            color:"gray"},
        tooltip: {
          trigger: 'axis',
          axisPointer: { // 坐标轴指示器,坐标轴触发有效
            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
          },
          show: true,


        },
        grid: {
          left: '2%',
          right: '4%',
          bottom: '14%',
          top:'16%',
          containLabel: false
        },
         legend: {
        data: ['充电量', '放电量', '温度'],
        right: 10,
        top:12,
        textStyle: {
            color: "#fff"
        },
 
        // itemGap: 35
    },
        xAxis: {
          type: 'category',
          data: years,
          axisLine: {
            lineStyle: {
              color: 'white'

            }
          },
          axisLabel: {
            // interval: 0,
            // rotate: 40,
            textStyle: {
              fontFamily: 'Microsoft YaHei'
            }
          },
        },

        yAxis: [
        {
          type: 'value',
          scale: false,
          min: 0,
          axisLine: {
            show: false,
            lineStyle: {
              color: 'white'
            }
          },
          splitLine: {
            show: true,
            lineStyle: {
              color: 'rgba(255,255,255,0.3)'
            }
          },
          axisLabel: {}
        },
        {
          type: 'value',
          scale: true,
          axisLine: {
            show: false,
            lineStyle: {
              color: 'gray'
            }
          },
          splitLine: {
            show: true,
            lineStyle: {
              color: 'gray'
            }
          },
          axisLabel: {}
        }
      
      ],
        
        series: [{
          name: '充电量',
          type: 'bar',
          barWidth: '15%',
          yAxisIndex: 0, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#fccb05'
                }, {
                    offset: 1,
                    color: '#f5804d'
                }]),
                barBorderRadius: 12,
            },
          },
          data: charges,
        },
        {
          name: '放电量',
          type: 'bar',
          barWidth: '15%',
          yAxisIndex: 0, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#8bd46e'
                }, {
                    offset: 1,
                    color: '#09bcb7'
                }]),
                barBorderRadius: 11,
            }
            
          },
          data: discharges
        },
        {
          name: '温度',
          type: 'line',
          yAxisIndex: 1, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#248ff7'
                }, {
                    offset: 1,
                    color: '#6851f1'
                }]),
            barBorderRadius: 11,
            }
          },
          data: temps
        }]
        };
  
          this.chart.setOption(option);
        });
      },
      exportExcel() {
        const workbook = new ExcelJS.Workbook();


const tableData = Array.from(document.querySelectorAll('#el-table tbody tr')).map(row => {
      return Array.from(row.querySelectorAll('td')).map(cell => cell.innerText);
    });
    const header = ['序号', '年份', '月份', '充电量', '放电量', '温度']; // 表头数据
    tableData.unshift(header);
        const columnIndexToRemove = 0;

// 遍历 elTable 数组,将每一行的第一列数据删除
        tableData.forEach(row => {
    row.splice(columnIndexToRemove, 1);
    });


        const worksheet = workbook.addWorksheet('数据图形');
        const worksheet2 = workbook.addWorksheet('数据表格');
        const chart = echarts.getInstanceByDom(this.$refs.chart);
        const base64Image = chart.getDataURL({
          pixelRatio: 2,
          backgroundColor: '#fff',
        });
        let image = workbook.addImage({
          base64: base64Image,
          extension: 'png',
        });
       
        worksheet.addImage(image, 'A1:Z30');
        worksheet2.addRows(tableData);
        workbook.xlsx.writeBuffer().then(function (buffer) {
          saveAs.saveAs(
            new Blob([buffer], {
              type: 'application/octet-stream',
            }),
            'xchart.xlsx'
          );
        });
      },
    },
  };
  </script>
  <template>
    <div>
      <div ref="chart" id="lineChart" style="height: 400px; width: 1000px"></div>
      <el-button @click="exportExcel">导出图表</el-button>

      <el-table :data="tableData" style="width: 100%" id="el-table"  border ref="tableRef" v-show="true">
                            <el-table-column type="selection" width="50" align="center" />
                            <el-table-column prop="year" label="年份"></el-table-column>
                            <el-table-column prop="month" label="月份"></el-table-column>
                            <el-table-column prop="charge" label="充电量"></el-table-column>
                            <el-table-column prop="discharge" label="放电量"></el-table-column>
                            <el-table-column prop="temp" label="温度"></el-table-column>
                        </el-table>

    </div>

  </template>

## 模态框点击以及自定义文件名
添加模态框组件

 <el-dialog v-model="dialog" title="表格导出" width="30%" @close="closeDialog">
      <el-input v-model="name" placeholder="请输入导出文件的文件名"></el-input>
      <el-alert title="默认文件名为(站点名+数据文件)" type="info" :closable="false" style="margin-top: 10px;" />
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="closeDialog">取消</el-button>
          <el-button type="primary" @click="exportExcel">确定</el-button>
        </span>
      </template>
    </el-dialog>

绑定开闭状态,在按钮上修改触发方法为开启模态框


      <el-button @click="openExportDialog">导出图表</el-button> <!-- 导出按钮 -->
    

对应的方法是

      openExportDialog() {
      this.dialog = true; // 打开模态框
    },

    closeDialog() {
      this.dialog = false; // 关闭模态框
    },

然后修改相应的状态

全部代码


  
  <script lang="ts">
  import * as echarts from 'echarts';
  import ExcelJS from 'exceljs';
  import { saveAs } from 'file-saver';
import {getAsyncTempCurrentData} from '../../../api/fenxi'
import {  toRefs } from 'vue'
import FileSaver from "file-saver";
import * as XLSX from 'xlsx'
import { ref, reactive, onMounted ,nextTick } from 'vue'
import { selectedStoreHook,useselectedStore } from "../../../store/modules/selected";
const store = useselectedStore();
const state = reactive({
    tableData: [] as any, // 表格数据
    dialog: false, // 模态框显示、隐藏
    name: '' // 自定义文件名
})
let filename = ''; 
const { tableData, dialog, name } = toRefs(state)

  export default {
    data() {
        const state = reactive({
    tableData: [] as any, // 表格数据
    dialog: false, // 模态框显示、隐藏
    name: '' // 自定义文件名,

})

      return {

        chart: null,
        tableData,
        dialog,
        name,
        
      };
    },
    mounted() {
  
      this.chart = echarts.init(this.$refs.chart);
      this.fetchData();
      
    },
    methods: {
      fetchData() {
        getAsyncTempCurrentData().then((response) => {
          console.log(response);
            this.tableData = response.data; 
          const years = response.data.map((item) => item.year + '年' + item.month + '月');
          const charges = response.data.map((item) => item.charge);
          const discharges = response.data.map((item) => item.discharge);
          const temps = response.data.map((item) => item.temp);
  
          const  option = {
            
          textStyle:{
            color:"gray"},
        tooltip: {
          trigger: 'axis',
          axisPointer: { // 坐标轴指示器,坐标轴触发有效
            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
          },
          show: true,


        },
        grid: {
          left: '2%',
          right: '4%',
          bottom: '14%',
          top:'16%',
          containLabel: false
        },
         legend: {
        data: ['充电量', '放电量', '温度'],
        right: 10,
        top:12,
        textStyle: {
            color: "#fff"
        },
 
        // itemGap: 35
    },
        xAxis: {
          type: 'category',
          data: years,
          axisLine: {
            lineStyle: {
              color: 'white'

            }
          },
          axisLabel: {
            // interval: 0,
            // rotate: 40,
            textStyle: {
              fontFamily: 'Microsoft YaHei'
            }
          },
        },

        yAxis: [
        {
          type: 'value',
          scale: false,
          min: 0,
          axisLine: {
            show: false,
            lineStyle: {
              color: 'white'
            }
          },
          splitLine: {
            show: true,
            lineStyle: {
              color: 'rgba(255,255,255,0.3)'
            }
          },
          axisLabel: {}
        },
        {
          type: 'value',
          scale: true,
          axisLine: {
            show: false,
            lineStyle: {
              color: 'gray'
            }
          },
          splitLine: {
            show: true,
            lineStyle: {
              color: 'gray'
            }
          },
          axisLabel: {}
        }
      
      ],
        
        series: [{
          name: '充电量',
          type: 'bar',
          barWidth: '15%',
          yAxisIndex: 0, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#fccb05'
                }, {
                    offset: 1,
                    color: '#f5804d'
                }]),
                barBorderRadius: 12,
            },
          },
          data: charges,
        },
        {
          name: '放电量',
          type: 'bar',
          barWidth: '15%',
          yAxisIndex: 0, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#8bd46e'
                }, {
                    offset: 1,
                    color: '#09bcb7'
                }]),
                barBorderRadius: 11,
            }
            
          },
          data: discharges
        },
        {
          name: '温度',
          type: 'line',
          yAxisIndex: 1, 
          itemStyle: {
            normal: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#248ff7'
                }, {
                    offset: 1,
                    color: '#6851f1'
                }]),
            barBorderRadius: 11,
            }
          },
          data: temps
        }]
        };
  
          this.chart.setOption(option);
        });
      },
      openExportDialog() {
      this.dialog = true; // 打开模态框
    },

    closeDialog() {
      this.dialog = false; // 关闭模态框
    },

       close() {
	// 模态框取消,重新获取数据
    this.fetchData();
},
      exportExcel() {
        if (state.name === '') {
      // 默认导出文件名
      filename = '站点' + store.siteid + '数据文件';
    } else {
      filename = state.name ;
    }


        const workbook = new ExcelJS.Workbook();


const tableData = Array.from(document.querySelectorAll('#el-table tbody tr')).map(row => {
      return Array.from(row.querySelectorAll('td')).map(cell => cell.innerText);
    });
    const header = ['序号', '年份', '月份', '充电量', '放电量', '温度']; // 表头数据
    tableData.unshift(header);
        const columnIndexToRemove = 0;

// 遍历 elTable 数组,将每一行的第一列数据删除
        tableData.forEach(row => {
    row.splice(columnIndexToRemove, 1);
    });


        const worksheet = workbook.addWorksheet('数据图形');
        const worksheet2 = workbook.addWorksheet('数据表格');
        const chart = echarts.getInstanceByDom(this.$refs.chart);
        const base64Image = chart.getDataURL({
          pixelRatio: 2,
          backgroundColor: '#fff',
        });
        let image = workbook.addImage({
          base64: base64Image,
          extension: 'png',
        });
       
        worksheet.addImage(image, 'A1:Z30');
        worksheet2.addRows(tableData);
        workbook.xlsx.writeBuffer().then(function (buffer) {
          saveAs.saveAs(
            new Blob([buffer], {
              type: 'application/octet-stream',
            }),
            filename+'.xlsx'
          );
        });
      },//
        save() {
  nextTick(function () {

    let filename = '';
        if (state.name === '') {
      // 默认导出文件名
      filename = '站点' + store.siteid + '数据文件.xlsx';
    } else {
      filename = state.name += '.xlsx';
    }
    const header = ['序号', '年份', '月份', '充电量', '放电量', '温度']; // 表头数据

// 将表头插入到 elTable 数组的开头

    // 创建工作簿
    const workbook = XLSX.utils.book_new();
    const xlsxParam = { raw: true }; // 转化成Excel使用原始格式

    // 获取表格数据
    const tableData = Array.from(document.querySelectorAll('#el-table tbody tr')).map(row => {
      return Array.from(row.querySelectorAll('td')).map(cell => cell.innerText);
    });
    tableData.unshift(header);

    const columnIndexToRemove = 0;

// 遍历 elTable 数组,将每一行的第一列数据删除
        tableData.forEach(row => {
    row.splice(columnIndexToRemove, 1);
    });
    // 创建工作表1
    const sheet1 = XLSX.utils.aoa_to_sheet(tableData);

    // 将工作表1添加到工作簿
    XLSX.utils.book_append_sheet(workbook, sheet1, '表格');




// 将echarts图表转换为图片

// 创建工作表2
const sheet2 = XLSX.utils.aoa_to_sheet([]);
const img = new Image();
img.src = 'http://localhost:4444/src/assets/admin.png';


// const chart = echarts.getInstanceByDom(this.$refs.chart) // 获取图表实例
//       const base64Image = chart.getDataURL({
//         pixelRatio: 2, // 导出图片的分辨率比例,默认为1,即图片的分辨率为屏幕分辨率的一倍
//         backgroundColor: '#fff' // 导出图片的背景色
//       })
//       let image= workbook.addImage({ // 添加图片
//           base64: base64Image, // 图片的base64编码
//           extension: 'png'  // 图片的扩展名
//         });
//         worksheet.addImage(image, 'A1:J20'); // 将图片添加到工作表中
//         workbook.xlsx.writeBuffer().then(function (buffer) { // 生成excel文件的二进制数据
//         saveAs.saveAs(new Blob([buffer], {  // 生成Blob对象
//           type: 'application/octet-stream'  // 指定文件的MIME类型
//         }), 'xchart.xlsx');  // 指定文件名
//       });


 XLSX.utils.book_append_sheet(workbook, sheet2, '图表');

    // 导出Excel文件
    XLSX.writeFile(workbook, filename);



  });
}
    }
  };
  </script>
  <template>
    <div ref="export" > 
      <div ref="chart" id="lineChart" style="height: 400px; width: 1000px" v-show="false"></div>
      <!-- <el-button @click="exportExcel">导出图表</el-button>
      <el-button type="primary" @click="exportExcel">导出</el-button>导出按钮 -->
      <el-button @click="openExportDialog">导出图表</el-button> <!-- 导出按钮 -->
    
 <!-- 模态框 -->
 <el-dialog v-model="dialog" title="表格导出" width="30%" @close="closeDialog">
      <el-input v-model="name" placeholder="请输入导出文件的文件名"></el-input>
      <el-alert title="默认文件名为(站点名+数据文件)" type="info" :closable="false" style="margin-top: 10px;" />
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="closeDialog">取消</el-button>
          <el-button type="primary" @click="exportExcel">确定</el-button>
        </span>
      </template>
    </el-dialog>
      <el-table :data="tableData" style="width: 100%" id="el-table"  border ref="tableRef" v-show="false">
                            <el-table-column type="selection" width="50" align="center" />
                            <el-table-column prop="year" label="年份"></el-table-column>
                            <el-table-column prop="month" label="月份"></el-table-column>
                            <el-table-column prop="charge" label="充电量"></el-table-column>
                            <el-table-column prop="discharge" label="放电量"></el-table-column>
                            <el-table-column prop="temp" label="温度"></el-table-column>
                        </el-table>

    </div>

  </template>

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

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

相关文章

基于社交网络优化的BP神经网络(分类应用) - 附代码

基于社交网络优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于社交网络优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.社交网络优化BP神经网络3.1 BP神经网络参数设置3.2 社交网络算法应用 4.测试结果…

linux进阶(脚本编程/软件安装/进程进阶/系统相关)

一般市第二种,以bash进程执行 shelle脚本编程 env环境变量 set查看所有变量 read设置变量值 echo用于控制台输出 类似java中的sout declear/typeset声明类型 范例 test用于测试表达式 if/else case while for 函数 脚本示例 软件安装及进阶 fork函数(复制一个进程(开启一个进…

TS 泛型你还不会?来!我教你

前言&#xff1a;最近遇到了一些写作上的烦恼&#xff0c;自己好像陷入了程序员的通病想法&#xff0c;“这个知识点这么简单&#xff0c;大家应该都会吧&#xff0c;我说出来是不是显得我很笨。” 思考了近一个月&#xff0c;又翻了翻自己最开始写作的文章&#xff0c;文笔虽…

python二次开发Solidworks:方程式驱动曲线

如果按照维度去划分&#xff0c;SOLIDWORKS中曲线可以划分为平面曲线和空间曲线&#xff0c;并且在二维草图还是3D草图中都提供了“方程式驱动曲线”。但是从使用方法来讲&#xff0c;方程式驱动的曲线分为两种定义方式:“显性”和“参数式”。“显式方程”在定义了起点和终点处…

核酸管外观缺陷检测(一)

1.1 应用示例思路 (1) 对核酸管图像进行灰度化、阈值分割和连通域分析&#xff1b; (2) 筛选出待检测的区域&#xff0c;并对该区域进行变换校正&#xff1b; (3) 进一步获取待检测的ROI区域&#xff0c;并根据几何特征和阈值条件&#xff0c;来对核酸管外观进行检测&#x…

openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成

文章目录 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成103.1 操作场景103.2 前提条件103.3 自认证证书生成过程 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成 openGauss默认…

【密评】商用密码应用安全性评估从业人员考核题库(十)

商用密码应用安全性评估从业人员考核题库&#xff08;十&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 2251 单项选择题 根据 GM/T 0030《服务器密码机技术规范》&#xff0…

系统架构师备考倒计时17天(每日知识点)

一、数据库设计阶段以及相应的产物 需求分析阶段&#xff1a;数据流图、数据字典、需求说明书&#xff1b;概念结构设计阶段&#xff1a;ER模型&#xff1b;逻辑结构设计阶段&#xff1a;关系模式&#xff1b;物理设计阶段&#xff1a;包括存储结构和存取方法的物理结构。 &…

35岁左右的项目经理,这5种能力一定要有​

大家好&#xff0c;我是老原。 经常有项目经理和我吐槽&#xff0c;现在不管是做项目&#xff0c;还是做管理&#xff0c;都太难了。 上有甲方和和老板给压力&#xff0c;下有团队成员叫苦连天&#xff0c;最后里外不是人。 刚毕业20多岁的时候还好&#xff0c;随着年龄的增…

(矩阵) 289. 生命游戏 ——【Leetcode每日一题】

❓ 289. 生命游戏 难度&#xff1a;中等 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一…

【算法设计与分析qwl】伪码——顺序检索,插入排序

伪代码&#xff1a; 例子&#xff1a; 改进的顺序检索 Search(L,x)输入&#xff1a;数组L[1...n]&#xff0c;元素从小到大排序&#xff0c;数x输出&#xff1a;若x在L中&#xff0c;输出x位置下标 j ,否则输出0 j <- 1 while j<n and x>L[j] do j <- j1 if x<…

2022年全网最全最细最流行的自动化测试工具有哪些?

一&#xff1a;前言 随着测试工程师技能和工资待遇的提升&#xff0c;甚至有一部分的开发人员开始转入测试岗位&#xff0c;跨入自动化领域的测试攻城狮越来越多。在自动化测试领域&#xff0c;自动化工具肯定占据了核心的位置。 本文总结了常用的测试自动化工具和框架&#x…

QT_day2

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

rust学习——函数返回值

概念 Rust 中的函数定义以 fn 开始&#xff0c;后跟着函数名和一对圆括号。大括号告诉编译器函数体在哪里开始和结束。 特殊的地方——函数返回值 错误的写法 正解1 去掉分号 fn main() {let x plus_one(5);println!("The value of x is: {}", x); }fn plus_…

c++_learning-进阶部分

文章目录 类&#xff1a;抽象类&#xff1a;类、类作用域&#xff1a;类成员访问权限&#xff1a;使用细节&#xff1a;成员函数的修饰符const、mutable&#xff1a;const在类中的使用&#xff1a;mutable&#xff1a; this&#xff1a;返回自身对象的引用构造函数&#xff08;…

思科 Packet Tracer实验(一)

思科 Packet Tracer实验&#xff08;一&#xff09; ​ Cisco Packet Tracer 是由Cisco公司发布的一个辅助学习工具&#xff0c;为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。用户可以在软件的图形用户界面上直接使用拖曳方法建立网络拓扑&#…

金山终端安全系统V9.0 SQL注入漏洞复现

0x01 产品简介 金山终端安全系统是一款为企业提供终端防护的安全产品&#xff0c;针对恶意软件、病毒和外部攻击提供防范措施&#xff0c;帮助维护企业数据和网络。 0x02 漏洞概述 金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞&#xff0c;该…

李彦宏:我们即将进入一个AI原生的时代|百度世界2023

“大模型带来的智能涌现&#xff0c;这是我们开发AI原生应用的基础。” 10月17日&#xff0c;李彦宏在百度世界2023上表示。当天&#xff0c;李彦宏以《手把手教你做AI原生应用》为主题发表演讲&#xff0c;发布文心大模型4.0版本&#xff0c;并带来新搜索、新地图等十余款AI原…

时间序列预测 Graph-WaveNet:Graph WaveNet for Deep Spatial-Temporal Graph Modeling

Graph-WaveNet Graph WaveNet for Deep Spatial-Temporal Graph Modeling1.概述2.提出问题 & 解决策略 & 模型结构3.实验结果 ** Graph WaveNet for Deep Spatial-Temporal Graph Modeling ** 1.概述 时空图建模是分析系统中各组成部分的空间关系和时间趋势的一项重…

从裸机启动开始运行一个C++程序(十)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开始运行一个C程序&#xff08;八&#xff09; 从裸机启动开始运行一个C程序&#xff08;七&#xff09; 从裸机启动开始运行一个C程序&#xff08;六&#xff09; 从裸机启动开始运…