Zapis z pliku XLSX i zastąpienie oryginalnego

0

Dzień dobry.

Mam zadanie, które polega na stworzenie programu w konsoli. Program ma z pliku w formacie XML wyrzucać określone atrybuty ID, TEXT i zapisywać do pliku XLSX (zwykły plik Excel, tekst w 1 kolumnie, a ID w drugiej), a na końcu jak np. zmodyfikuję te wartości ID, TEXT w pliku XLSX (Excel) to program ma mieć również możliwość zrobienia kopii pliku oryginalnego (XML), a potem uzupełnić go o zmodyfikowane pola ID,TEXT z pliku Excelowego.

Pierwsze dwa punkty mam zrobione (tylko nie mam Excela w dwóch kolumnach), jak również robienie kopii pliku oryginalnego. Tylko nie potrafię wymyśleć metody, która pobierałaby z pliku XLSX wartości ID, TEXT i uzupełniałaby te wartości w pliku skopiowanym XLS. Może ktoś mi pomóc?

0

Czyli masz XML, wczytujesz go do Excela, gdzie wprowadza zmiany i chcesz znowu nanieść to do XML?

Nie napisałeś jak pobierasz dane z tego XLS a, ale zakładam, że iterujesz po wierszach.
W takim wypadku wystarczy wczytać XML do pamięci, wziąć ID z wiersza XLSa i poszukać odpowiadajacego mu w węzła w XMLu, używając np. : LINQ.

Potem tylko nanosisz treść i po zakończeniu pętli zapisujesz nowy plik.

Jak coś nie jest jasne to wrzuć kod i zobaczymy co można z tym zrobić :)

0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Xml.XPath;

namespace projektPierwszyQLoc
{

    public class XmlReader
    {

        public XmlDocument XmlDoc;
        
        public XmlReader(string PathFile)
        {
            XmlDoc = new XmlDocument();
            XmlDoc.Load(PathFile);
        }



        public int GetNumberOfItems(string name)
        {
            return XmlDoc.GetElementsByTagName(name).Count;
        }

        public string GetElementValue(int number, string name)
        {
            return XmlDoc.GetElementsByTagName(name).Item(number).InnerText;
        }


        public string GetAttributeValue(int number, string ElementName, string AttributeName)
        {
            XmlNode Node = XmlDoc.GetElementsByTagName(ElementName).Item(number);
            return Node.Attributes.GetNamedItem(AttributeName).InnerText;
        }

        public void SaveAttributeValueInFile()
        {

            XmlReader xmlReader = new XmlReader("English.xtest");
            int i = xmlReader.GetNumberOfItems("TEXT_NODE");
            for (int a = 0; a != i; a++)
            {
                StreamWriter sw;
                sw = File.AppendText("test.xlsx");
                if (a == 0) sw.Write("ID\r\n");
                sw.Write(xmlReader.GetAttributeValue(a, "TEXT_NODE", "ID") + "\r\n");
                sw.Close();
            }

            for (int b = 0; b != i; b++)
            {
                StreamWriter sw2;
                sw2 = File.AppendText("test.xlsx");
                if (b == 0) sw2.Write("\r\nTEXT\r\n");
                sw2.Write(xmlReader.GetAttributeValue(b, "TEXT_NODE", "TEXT") + "\r\n");
                sw2.Close();
            }
        }


    }


    class Program

    {


        static void Main(string[] args)
        {

            int akcja;
            do
            {
                Console.WriteLine("-------------------------------------------------");
                Console.WriteLine("1) Importować dane do pliku XLSX");
                Console.WriteLine("2) Utworzyć nowy plik źródłowy z poprawnym tłumaczeniem");
                Console.WriteLine("3) Zakończyć program");
           
                Console.WriteLine("-------------------------------------------------");
                Console.Write("Co chcesz zrobić ... ");
                akcja = int.Parse(Console.ReadLine());
                Console.Clear();
                

                switch (akcja)
                {
                    case 1:

                        XmlReader nazwa = new XmlReader("English.xtest");

                        nazwa.SaveAttributeValueInFile();

                        Console.WriteLine("Zapisałeś aktualny plik xtest jako XLSX. Możesz teraz udać się do niego i przetłumaczyć.");

                        break;

                    case 2:
                        string Copy = ("English.xtest");
                        string Paste = ("EnglishPrzetlumaczony.xtest");

                        if(!File.Exists(Paste))
                        {
                            File.Copy(Copy, Paste);
                        }

                        XmlDocument document = new XmlDocument();
                        XPathDocument document2 = new XPathDocument("EnglishPrzetlumaczony.xtest");
                        document.Load("EnglishPrzetlumaczony.xtest");

                        
                        XmlNode node = document.SelectSingleNode("TEXT_LIST/TEXT_NODE");
                        
                        
                            node.Attributes["ID"].Value = "33232332";
                            


                            document.Save("EnglishPrzetlumaczony.xtest");
                        
                        

                        Console.WriteLine("Utworzyłeś plik źródłowy z poprawionym tłumaczeniem");

                        break;

                    case 3:
                        Console.WriteLine("Zakończyłeś program");

                        break;

                }

            }while (akcja != 3);
  
            


        }

    }


}

Tak wygląda mój program. Właśnie nie wiem jak użyć tego LINQ i przemieszczać się w dół po pliku XML :<

0

Mógłbyś dołączyć jeszcze .xtest? :)

0

Już sobie poradziłem z zadaniem. Właśnie za pomocą LINQ :). Dzięki wielkie!
A chcesz ten plik .xtest?

0

Jak już sobie poradziłeś to nie będzie potrzebny :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1