首页 > 其他分享 >多组数据组合输出成表格

多组数据组合输出成表格

时间:2024-11-12 17:42:15浏览次数:1  
标签:输出 Name 表格 多组 cells int var new CellValue

需求如下:

有一组变量,数量不确定,变量的取值是1-n个,组合每个变量的各种取值得到图2的结果并保存为文件。

 (图1)

 (图2)

直接上代码:

一、先定义要导出的数据结构

namespace TestAppendCellData
{
    public class ExportDataDriverTemplateData
    {
        /// <summary>
        /// key
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 值
        /// </summary>
        public object Value { get; set; }

        /// <summary>
        /// 参数提示
        /// </summary>
        public string Tip { get; set; }
        /// <summary>
        /// 是否包含驱动数据
        /// </summary>
        public bool IsDriverData { get; set; } = false;

        public List<string>? DriverData { get; set; }
    }
}
ExportDataDriverTemplateData

二、主程序文件

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace TestAppendCellData
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");

            var d1 = new ExportDataDriverTemplateData { Tip = "等待毫秒1", Name = "ms1", Value = "1000" };
            var d2 = new ExportDataDriverTemplateData { Tip = "等待毫秒2", Name = "ms2", Value = "1000" };
            d2.IsDriverData = true;
            d2.DriverData = ["2000", "2001", "2002", "2003"];
            var d3 = new ExportDataDriverTemplateData { Tip = "等待毫秒3", Name = "ms3", Value = "1000" };
            d3.IsDriverData = true;
            d3.DriverData = ["3000", "3001"];
            var d4 = new ExportDataDriverTemplateData { Tip = "等待毫秒4", Name = "ms4", Value = "1000" };
            d4.IsDriverData = true;
            d4.DriverData = ["4000", "4001", "4002"];
            var d5 = new ExportDataDriverTemplateData { Tip = "等待毫秒5", Name = "ms5", Value = "1000" };

            var d6 = new ExportDataDriverTemplateData { Tip = "等待毫秒6", Name = "ms6", Value = "1000" };
            d6.IsDriverData = true;
            d6.DriverData = ["6000", "6001"];

            List<ExportDataDriverTemplateData> datas = [d1, d2, d3, d4, d5, d6];
            using var ms = CreateExcelStreamFromJson(datas);
            File.WriteAllBytes(@"d:/cel.xls", ms.ToArray());
            Console.WriteLine("done!");
            Console.ReadLine();
        }


        private static MemoryStream CreateExcelStreamFromJson(List<ExportDataDriverTemplateData> datas)
        {
            MemoryStream memoryStream = new MemoryStream();
            using (SpreadsheetDocument document = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
            {
                WorkbookPart workbookPart = document.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();
                WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet(new SheetData());

                Sheets sheets = document.WorkbookPart!.Workbook.AppendChild(new Sheets());
                Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
                sheets.Append(sheet);

                SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>()!;
                AppendCellData(datas, sheetData);
            }

            memoryStream.Position = 0;
            return memoryStream;
        }

        private static void AppendCellData(List<ExportDataDriverTemplateData> datas, SheetData sheetData)
        {
            Row tipRow = new();
            Row nameRow = new();
            List<List<Cell>> cells = [];
            foreach (var item in datas)
            {
                Cell tipCell = new() { CellValue = new CellValue(item.Tip), DataType = CellValues.String };
                Cell nameCell = new() { CellValue = new CellValue(item.Name), DataType = CellValues.String };
                tipRow.Append(tipCell);
                nameRow.Append(nameCell);
                if (item.IsDriverData)
                {
                    List<Cell> ddCList = [];
                    foreach (var ddata in item.DriverData!)
                    {
                        Cell valueCell = new() { CellValue = new CellValue(ddata ?? ""), DataType = CellValues.String };
                        ddCList.Add(valueCell);
                    }
                    cells.Add(ddCList);
                }
                else
                {
                    Cell valueCell = new() { CellValue = new CellValue(item.Value?.ToString() ?? ""), DataType = CellValues.String };
                    cells.Add([valueCell]);
                }
            }

            sheetData.Append(tipRow);
            sheetData.Append(nameRow);

            int totalRows = 1;
            foreach (var c in cells)
            {
                totalRows *= c.Count;
            }

            var totalCells = cells.Count;
            int[][] data = new int[totalRows][];
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = new int[totalCells];
            }


            for (int cellIndex = totalCells - 1; cellIndex >= 0; cellIndex--)
            {
                var rowRepeat = GetRowRepeat(cells, cellIndex);
                for (int row = 0; row < totalRows; row++)
                {
                    var idx = (row / rowRepeat) % cells[cellIndex].Count;
                    data[row][cellIndex] = idx;
                }
            }

            int GetRowRepeat(List<List<Cell>> cells, int cellIndex)
            {
                int count = 1;
                int start = cellIndex + 1;
                if (start < cells.Count)
                {
                    for (int i = start; i < cells.Count; i++)
                    {
                        count *= cells[i].Count;
                    }
                }
                return count;
            }

            for (int i = 0; i < totalRows; i++)
            {
                var clist = new List<Cell>();
                var row = data[i];
                Console.Write($"{i:00} >>  ");
                for (int j = 0; j < totalCells; j++)
                {
                    Console.Write($" {row[j]:00}");
                    clist.Add((cells[j][row[j]].CloneNode(true) as Cell)!);
                }
                Console.WriteLine();

                Row valueRow = new();
                valueRow.Append(clist);
                sheetData.Append(valueRow);
            }


            Thread.Sleep(10);
        }

    }
}
View Code

三、控制台效果部分截图

 

标签:输出,Name,表格,多组,cells,int,var,new,CellValue
From: https://www.cnblogs.com/lucienbao/p/18542348/datacombinations

相关文章

  • ATE测试 - STDF文件分析 - Excel报表格式探讨
    1、转换对象:STDF文件2、适用人员:TE或解决方案人员或需要对测试项TestItem原始测试值进行分析的2、Excel格式:如下示意图4、局限性:Excel一个sheet中,列数最大不能超过16384列,行数最大不能超过1048576行,因此这种格式对于超过16384颗Die的文件就无法生成Excel文件了,但对于TE来......
  • Flink日志输出查看方式 通过web页面 Stdout 查看控制台日志
    Flink日志输出查看方式在网上查看flink日志查看方式,竟然查询不到,因此写下这篇文章,给有此困惑的小盆友们,也给自己做个总结!前情提要:我是通过flinkwebui提交的flink任务的,因此通过flinkui查看自身控制台打印输出的。第一步:打开flink的Dashboard看到TaskManager的控制面......
  • 【MATLAB源码-第290期】基于matlab的MRC检测算法在OTFS通信系统中的仿真,输出误码率曲
    操作环境:MATLAB2022a1、算法描述在无线通信系统的发展历程中,随着频谱的日益紧张以及高频通信需求的增加,传统的通信方法逐渐显露出其在复杂信道环境中的局限性。尤其是在高速移动、多径传播和多普勒效应严重的环境下,传统的OFDM(正交频分复用)等技术往往难以应对这些挑战。因此......
  • wifi模块使用主控输出的32k时钟
    soc:rk3568WiFi模块需要的32.768K时钟,有三种时钟源,rk809和8563提供,或者使用主控输出的。 dts修改如下:&wireless_bluetooth{compatible="bluetooth-platdata";-clocks=<&rk8091>;+clocks=<&cruSCLK_32K_IOE>;clock-n......
  • 超强抗干扰单键触摸/电容式触控IC-VK3601 SOT23-6单通道直接输出/触摸感应方案原厂
    产品品牌:永嘉微电/VINKA产品型号:VK3601封装形式:SOT23-6概述VK3601具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了1路直接输出功能。芯片内部采用特殊的集成电路,具有高电源电压抑制比,可......
  • 各个语言的标准输入输出(C++,Python,Go,MATLAB)
    标准输入和输出C/C++cin,cout,getline()进行输入输出#include<bits/stdc++.h>usingnamespacestd;intmain(){//输入`1231231` inta,b,c; cin>>a>>b>>c; cout<<a<<b<<c<<endl;//输出1231231并换行(endl代表换行) //输入`......
  • vue3+element plus +js 实现树形和末级展开是表格
    1、实现一个树形和末级展开是表格,需要支持大数据量,因此使用VirtualizedTable虚拟化表格 el-table-v22、效果图 3、代码<template><el-table-v2:header-height="0"v-model:expanded-row-keys="expandedRowKeys":columns="columns"......
  • STM32CubeMX:使用DAC输出正弦波的三种方法(while,定时器中断,DMA)
    1.DAC概念简介:DAC的工作原理是根据数字输入信号的数值,生成相应的模拟输出电压或电流。它通常接收一个二进制数字输入,该数字代表了一个特定的数值范围。DAC通过将这个数字值转换为模拟信号的电压或电流水平来输出。(功能与ADC相反)2.正弦波输出方式1:简单粗暴while循环输出Cub......
  • C小题目-输入10个数,要求输出其中值最大的元素和该数是第几个数
    #include<stdio.h>intmax(intx,inty){returnx>y?x:y;};intmain(){inta[10];inti,m,n;for(i=0;i<10;i++){printf("请输入第%d个数:",i);scanf("%d",&a[i]);};for(i=0,m=a[0],n=......
  • 第七章-输入和输出流
    一、单项选择题1.File对象不能用来                                                   【】A.命名文件          B.查询文件属性          C.读写文件        D.处理目录2.......