엑셀 파일을 XML로 변환하는 방법 질문 드립니다.

안녕하십니까, 엑셀 파일 XML로 변환하는 방법에 질문 드립니다.

현재 유지보수 하고 있는 신입 개발자입니다.

사용하는 언어는 C#이고 DevExpress를 사용하고 있습니다.

프로그램 내에 버튼 클릭 이벤트를 통해 FTP 서버에있는 엑셀 파일을 다운로드 하는 기능이 구현이 되어있습니다.

다운로드 한 엑셀 파일을 형식이 지정된 XML파일 형식으로 변환하여 2개의 FTP 서버로 전송하는 기능을 구현하는 방법을 알고 싶습니다.

또는 ODBC 드라이버를 통해 excel 문서를 읽어 처리 가능합니다.

정보 감사합니다.
공유 해주신 내용을 토대로 작업해보고 궁금한 내용 있으면
답변 남겨드리겠습니다 :grinning:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(@"엑셀파일명.xlsx", false))
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
    SharedStringTable sst = sstpart.SharedStringTable;
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    string? text;
    foreach (Row r in sheetData.Elements<Row>())
    {
        foreach (Cell c in r.Elements<Cell>())
        {
            if (c.DataType != null && c.DataType == CellValues.SharedString)
                text = sst.ChildElements[int.Parse(c.CellValue!.Text)].InnerText;
            else
                text = c?.CellValue?.Text;
            Console.Write(text + " ");
        }
        
        Console.WriteLine();
    }
}

이건 이번에 질문 주셔서 검색해보고 찾았는데
별도로 드라이버 설치 안해도 되는건 편한거 같네요.

이전에 제가 한건 ODBC를 통해서 였습니다.

비전공자인데 C#언어를 공부한게 아니라 다른 언어를 공부했다보니
조금 많이 어렵네요…ㅠㅠ

오 질문 내용 그대로 GPT 에 물어보시는건 어떨까요?

2. 엑셀 파일을 XML 형식으로 변환

엑셀 파일을 읽고 XML로 변환하기 위해서는 ClosedXMLSystem.Xml.Linq 라이브러리를 사용할 수 있습니다. ClosedXML 라이브러리를 NuGet 패키지로 설치할 수 있습니다.

using System;
using System.Data;
using System.IO;
using System.Xml.Linq;
using ClosedXML.Excel;

class ExcelToXmlConverter
{
    public static void ConvertExcelToXml(string excelFilePath, string xmlFilePath)
    {
        using (var workbook = new XLWorkbook(excelFilePath))
        {
            var worksheet = workbook.Worksheet(1);
            var dataTable = new DataTable();

            // Add columns to DataTable
            foreach (var cell in worksheet.Row(1).Cells())
            {
                dataTable.Columns.Add(cell.Value.ToString());
            }

            // Add rows to DataTable
            foreach (var row in worksheet.RowsUsed().Skip(1))
            {
                var dataRow = dataTable.NewRow();
                int i = 0;
                foreach (var cell in row.Cells())
                {
                    dataRow[i++] = cell.Value;
                }
                dataTable.Rows.Add(dataRow);
            }

            // Convert DataTable to XML
            var xml = new XDocument(
                new XElement("Root",
                    from DataRow row in dataTable.Rows
                    select new XElement("Row",
                        dataTable.Columns.Cast<DataColumn>().Select(col => new XElement(col.ColumnName, row[col]))
                    )
                )
            );
            xml.Save(xmlFilePath);
        }
    }
}

  1. 변환된 XML 파일을 두 개의 FTP 서버로 업로드
class FTPUpload
{
    public static void UploadFile(string ftpUrl, string localPath, string ftpUsername, string ftpPassword)
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(ftpUsername, ftpPassword);

        using (Stream fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read))
        using (Stream ftpStream = request.GetRequestStream())
        {
            fileStream.CopyTo(ftpStream);
        }
    }
}

사용 예제

class Program
{
    static void Main()
    {
        string ftpDownloadUrl = "ftp://example.com/path/to/your/file.xlsx";
        string localExcelPath = "path/to/downloaded/file.xlsx";
        string ftpUsername = "yourFtpUsername";
        string ftpPassword = "yourFtpPassword";
        
        string localXmlPath = "path/to/converted/file.xml";
        string ftpUploadUrl1 = "ftp://example.com/path/to/upload/file1.xml";
        string ftpUploadUrl2 = "ftp://example.com/path/to/upload/file2.xml";

        // 1. FTP 서버에서 엑셀 파일 다운로드
        FTPDownload.DownloadFile(ftpDownloadUrl, localExcelPath, ftpUsername, ftpPassword);

        // 2. 엑셀 파일을 XML 형식으로 변환
        ExcelToXmlConverter.ConvertExcelToXml(localExcelPath, localXmlPath);

        // 3. 변환된 XML 파일을 두 개의 FTP 서버로 업로드
        FTPUpload.UploadFile(ftpUploadUrl1, localXmlPath, ftpUsername, ftpPassword);
        FTPUpload.UploadFile(ftpUploadUrl2, localXmlPath, ftpUsername, ftpPassword);
    }
}

C#의 경우 Copilot에게 물어봐도 꽤 상세히 알려줍니다. 최종 확인은 해야겠지요.

using System;
using System.Xml;
using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook workbook = excelApp.Workbooks.Open(@"C:\path\to\your\file.xlsx");

        XmlDocument xmlDoc = new XmlDocument();
        XmlElement xmlRoot = xmlDoc.CreateElement("Root");
        xmlDoc.AppendChild(xmlRoot);

        foreach (Excel.Worksheet worksheet in workbook.Sheets)
        {
            XmlElement xmlSheet = xmlDoc.CreateElement("Sheet");
            xmlSheet.SetAttribute("Name", worksheet.Name);
            xmlRoot.AppendChild(xmlSheet);

            Excel.Range usedRange = worksheet.UsedRange;
            for (int row = 1; row <= usedRange.Rows.Count; ++row)
            {
                XmlElement xmlRow = xmlDoc.CreateElement("Row");
                xmlSheet.AppendChild(xmlRow);

                for (int col = 1; col <= usedRange.Columns.Count; ++col)
                {
                    XmlElement xmlCell = xmlDoc.CreateElement("Cell");
                    xmlCell.InnerText = Convert.ToString(usedRange.Cells[row, col].Value);
                    xmlRow.AppendChild(xmlCell);
                }
            }
        }

        xmlDoc.Save(@"C:\path\to\output.xml");

        workbook.Close();
        excelApp.Quit();
    }
}

조언 감사합니다~! GPT에 한번 물어봐야겠네요~!

Copilot은 한번도 안써봤었는데 이번 기회에 한번 써봐야겠습니다 ㅎㅎ
조언 감사합니다~!

Excel Interop 의 경우 백그라운드에서 엑셀을 직접 실행하는 형태로 동작하는 것이라 엑셀이 설치되어있어야하고 성능도 매우 느립니다.

따라서 학습 목적이 아니라면 비추천드립니다.

1개의 좋아요