Open XML 里写入List数据

思路:

  • List数据转换成DataTable
  • 然后将DataTable的行列写进Excel里

第一步 将List数据转换成DataTable

这里注意枚举值,如果不对枚举值进行转换,那么最后生成的数据是int类型的数据。

private static System.Data.DataTable ToDataTable<T>(IList<T> data)
        {
            PropertyDescriptorCollection props =
                TypeDescriptor.GetProperties(typeof(T));
            System.Data.DataTable table = new System.Data.DataTable();
            for (int i = 0; i < props.Count; i++)
            {
                PropertyDescriptor prop = props[i];
                if (prop.PropertyType.IsEnum)
                {
                    table.Columns.Add(prop.Name, typeof(string));
                }
                else
                {
                    table.Columns.Add(prop.Name, prop.PropertyType);
                }

            }
            object[] values = new object[props.Count];
            foreach (T item in data)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    if (props[i].GetValue(item) is Enum)
                    {
                        values[i] = props[i].GetValue(item).ToString();
                    }
                    else
                    {
                        values[i] = props[i].GetValue(item);
                    }
                }
                table.Rows.Add(values);
            }
            return table;
        }

第二步 然后将DataTable的行列写进Excel里

注意事项

  • 日期的转换,可以把日期转换成字符串
  • 布尔值的转换,在Excel里,布尔值实际上是0或者1
        private static void CreateExcel<T>(string filePath, string sheetName,List<T> models)
        {
            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook))
            {
                //添加workbook文件,并创建workbook节点
                WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                //在workbook里添加sheetdata节点
                WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet(new SheetData());

                //添加sheets文件夹
                Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

                //添加sheet文件
                Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = sheetName };
                sheets.Append(sheet);

                //给SheetData添加数据
                SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();

                System.Data.DataTable table = ToDataTable<T>(models);

                Row headerRow = new Row();

                List<String> columns = new List<string>();

                //标题名全是string
                foreach (DataColumn column in table.Columns)
                {
                    columns.Add(column.ColumnName);
                    Cell cell = new Cell();
                    cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    cell.CellValue = new CellValue(column.ColumnName);
                    headerRow.Append(cell);
                }
                sheetData.Append(headerRow);

                foreach (DataRow dsrow in table.Rows)
                {
                    Row newRow = new Row();
                    foreach (String col in columns)
                    {
                        Cell cell = new Cell();
                        if (dsrow[col].GetType().Name == "Int32"|| dsrow[col].GetType().Name == "Double")
                        {
                            cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                            cell.CellValue = new CellValue(dsrow[col].ToString());
                        }
                        else if (dsrow[col].GetType().Name == "DateTime")
                        {
                            cell.DataType = new EnumValue<CellValues>(CellValues.String);
                            DateTime dtValue = (DateTime)dsrow[col];
                            cell.CellValue = new CellValue(dtValue.ToShortDateString().ToString());
                        }
                        else if (dsrow[col].GetType().Name == "Boolean")
                        {
                            cell.DataType = new EnumValue<CellValues>(CellValues.Boolean);
                            cell.CellValue = new CellValue((bool)dsrow[col]==true?"1":"0");
                        }
                        else
                        {
                            cell.DataType = new EnumValue<CellValues>(CellValues.String);
                            cell.CellValue = new CellValue(dsrow[col].ToString());
                        }
                        newRow.Append(cell);
                    }
                    sheetData.Append(newRow);
                }

                workbookPart.Workbook.Save();
            }
        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用struct和QList来构建并写入XML文件。下面是一个简单的示例: 首先,我们定义一个结构体(struct)来表示XML中的数据项。例如,假设我们要表示一个学生的信息,可以定义如下的结构体: ```cpp struct Student { QString name; int age; QString major; }; ``` 然后,我们创建一个QList来保存多个学生的信息: ```cpp QList<Student> studentList; ``` 接下来,我们可以使用QDomDocument类来创建XML文档,并将学生信息写入XML中: ```cpp QDomDocument doc; // 创建根节点 QDomElement root = doc.createElement("Students"); doc.appendChild(root); // 遍历学生列表,将每个学生信息添加到XML中 foreach(const Student& student, studentList) { // 创建学生节点 QDomElement studentNode = doc.createElement("Student"); // 创建姓名节点,并设置文本内容 QDomElement nameNode = doc.createElement("Name"); nameNode.appendChild(doc.createTextNode(student.name)); studentNode.appendChild(nameNode); // 创建年龄节点,并设置文本内容 QDomElement ageNode = doc.createElement("Age"); ageNode.appendChild(doc.createTextNode(QString::number(student.age))); studentNode.appendChild(ageNode); // 创建专业节点,并设置文本内容 QDomElement majorNode = doc.createElement("Major"); majorNode.appendChild(doc.createTextNode(student.major)); studentNode.appendChild(majorNode); // 将学生节点添加到根节点下 root.appendChild(studentNode); } // 将XML文档保存到文件 QFile file("students.xml"); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream stream(&file); stream << doc.toString(); file.close(); } ``` 上述代码中,我们使用QDomDocument创建了一个XML文档,然后通过遍历学生列表,将每个学生的信息添加到XML中。最后,将XML文档保存到文件中。 请注意,这只是一个简单的示例,实际的XML结构和数据可能更加复杂。你可以根据自己的需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值