使用C#读取Excel文件,生成XML文件,在XML内附加和/或重写Excel数据

时间:2018-10-18 04:25:37

标签: c# xml append

我编写了一个从Excel文件读取的代码。然后将内部内容序列化为xml文件。如果内容在同一1个工作表中,则效果很好。

我现在的问题是,我在Excel文件中有2个工作表,需要将它们合并成1个xml文件。

第一个工作表=警告列表, 第二个工作表=错误列表

序列化xml文件时,警告列表将写在顶部,错误列表将显示在警告列表的末尾。

我的问题是:

  1. 如何使用c#将错误列表附加到xml文件中的警告列表下?因为我在Excel文件中有50行用于警告和错误

  2. 如果将来某个列表中有一个新项添加到其中,例如:错误列表中添加了新的错误消息和操作,如何在不影响警告列表内容的情况下覆盖它? p>

谢谢

这是我的代码:

clear

x = load('d:/ex2x.dat');
y = load('d:/ex2y.dat');
figure(1), clf, plot(x, y, '*'), xlabel('Age in years'), ylabel('Height in meters')

m = length(y); % store the number of training examples
x = [ones(m, 1), x]; % Add a column of ones to x


theta=[0,0];  alpha=0.07;

residuals = x*theta' - y ; %same as:  sum(x.*theta,2)-y
theta = theta - alpha*mean(residuals.*x);

disp(theta)

预期的xml文件输出:

    private void generateAlarm_List(Excel.Range _range, string filePath, int _alarmCodeColumn, int _alarmModuleColumn,
            int _alarmMessageColumn, int _alarmActionColumn, int _alarmAddressCodeColumn)
        {
            try
            {
                SiemensAlarmEditorModel siemensAlarmEditorModel = new SiemensAlarmEditorModel()
                {
                    SiemensPLCName = "blablabla",
                    SiemensS7Connection = 1,
                    SiemensAlarmAddressType = SiemensAddressType.MemoryBit
                };

                for (int i = 5; i <= _range.Rows.Count; i++)
                {
                    object warningAlarmCode = (_range.Cells[i, _alarmCodeColumn] as Excel.Range).Value2;
                    object warningAlarmModule = (_range.Cells[i, _alarmModuleColumn] as Excel.Range).Value2;
                    object warningAlarmMessage = (_range.Cells[i, _alarmMessageColumn] as Excel.Range).Value2;
                    object warningAlarmAction = (_range.Cells[i, _alarmActionColumn] as Excel.Range).Value2;
                    object warningAlarmAddressCode = (_range.Cells[i, _alarmAddressCodeColumn] as Excel.Range).Value2;

                    object errorAlarmCode = (_range.Cells[i, _alarmCodeColumn] as Excel.Range).Value2;
                    object errorAlarmModule = (_range.Cells[i, _alarmModuleColumn] as Excel.Range).Value2;
                    object errorAlarmMessage = (_range.Cells[i, _alarmMessageColumn] as Excel.Range).Value2;
                    object errorAlarmAction = (_range.Cells[i, _alarmActionColumn] as Excel.Range).Value2;
                    object errorAlarmAddressCode = (_range.Cells[i, _alarmAddressCodeColumn] as Excel.Range).Value2;

                    if (warningAlarmCode != null && warningAlarmMessage != null
                        && warningAlarmAction != null && warningAlarmAddressCode != null)
                    {
                        siemensAlarmEditorModel.SiemensAlarmWarningList.Add(new AlarmModel
                        {
                            AlarmCode = Convert.ToInt32(warningAlarmCode),
                            AlarmModule = warningAlarmModule.ToString(),
                            AlarmMessage = warningAlarmMessage.ToString(),
                            AlarmAction = warningAlarmAction.ToString(),
                            AlarmAddressCode = Convert.ToDouble(warningAlarmAddressCode.ToString().Trim().Remove(0, 2))
                        });
                    }

                    if (errorAlarmCode != null && errorAlarmMessage != null
                      && errorAlarmAction != null && errorAlarmAddressCode != null)
                    {
                        siemensAlarmEditorModel.SiemensAlarmErrorList.Add(new AlarmModel
                        {
                            AlarmCode = Convert.ToInt32(errorAlarmCode),
                            AlarmModule = errorAlarmModule.ToString(),
                            AlarmMessage = errorAlarmMessage.ToString(),
                            AlarmAction = errorAlarmAction.ToString(),
                            AlarmAddressCode = Convert.ToDouble(errorAlarmAddressCode.ToString().Trim().Remove(0, 2))
                        });
                    }
                }XmlTools.Serialize(filePath, siemensAlarmEditorModel);
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }
        }

   

1 个答案:

答案 0 :(得分:0)

因为您的alarmEditorModel在警告列表和错误列表中有两个单独的条目,所以从理论上讲,您将使每个列表出现在根的两个不同元素下。如果要查找包含警告和错误的单个列表,则可以创建“ AlarmModel”的单个列表,然后序列化该列表。如果您无法控制它们的添加顺序,则可以将“ IsError”或“ IsWarning”的字段添加到“ AlarmModel”,然后用[System.Xml.Serialization.XmlIgnore]标记为防止它出现在输出中。然后,在序列化之前,您可以按该新字段对列表进行排序。

但是,在上面的代码中,您似乎在为警告和错误拉出相同的字段,因此所有内容始终会被标记为“警告”。我看不到您在哪里引用两个不同的工作表。如果要从sheet1和sheet2两次调用此方法,则无需将WARNING和ERROR分开。