it-source

C# csv를 xls로 변환(기존 csv 파일 사용)

criticalcode 2023. 6. 25. 20:10
반응형

C# csv를 xls로 변환(기존 csv 파일 사용)

저는 이 문제에 대해 많은 논의가 있다고 믿습니다.하지만 나는 모든 게시물을 읽고 시도했지만 그것은 결코 c#에서 작동하지 않습니다. 나의 목표는 내가 기존의 csv 파일을 가지고 있다는 것입니다.단지 엑셀 파일을 변환하고 완료하기를 원합니다. 많은 사람들이 첨탑을 사용하여 그렇게 말했습니다.xls 뭔가 하지만 나는 ms.office를 믿습니다.interop.accips는 그것을 처리할 수 있었습니다.

.csv에서 .xlsx로 Excel 파일 변환

나는 위의 이슈를 읽었고 이것은 나의 문제와 같습니다.하지만 위의 코드는 내 PC에서 작동하지 않습니다.이것을 사용하려면 다른 dll을 가져와야 합니까?저는 그냥 그 사이트에서 코드를 복사합니다.아래에 다시 복사...

저는 현재 Lib를 MS.office로 사용하고 있습니다.interop.excel 및 MS. 사무실인터오프.코어

Application app = new Application();
Workbook wb = app.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing,               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"C:\testcsv.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing,    Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();

여기에 많은 오류가 있습니다. 수정 코드는 아래에 있고 지금은 MS.office만 사용하고 있습니다.interop.excel 및 MS. 사무실interop.core를 참조합니다.다른 dll 파일을 사용해야 할 것 같습니다.어쨌든 나는 그 코드를 따라 새로운 코드를 만들었습니다.그것은 오류를 줄이지만 저는 이것이 올바른 접근법인지 모르겠습니다. 아래는 제가 지금 시도한 것입니다.

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;

System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);

xlWorkBook = xlApp.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.SaveAs(@"C:\testcsv.xlsx",    XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Close(); 

그리고 여기 오류 메시지가 있습니다.

오류 3 'XlFileFormat' 이름이 현재 컨텍스트 C:\Users\jochoi\Desktop\joseph_BT_류전_code\DC_Test - ver01\DC_Test\DC.cs 52854 DC_Test
오류 4 'XlSaveAsAsAccessMode' 이름이 현재 컨텍스트 C에 없습니다.\Users\jochoi\Desktop\joseph_BT_류전_code\DC_Test - ver01\DC_Test\DC.cs 528142 DC_Test
오류 4 메서드 '닫기'에 대한 오버로드가 없으면 '0' 인수 C:\Users\jochoi\Desktop\joseph_BT_류전_code\DC_Test - ver01\DC_Test\DC.cs 525 13 DC_Test

제 목표는 그냥 기존 CSV 파일을 가져와서 엑셀 파일로 바꾸는 것입니다. 제 PC에서는 그 대답이 작동하지 않기 때문에 다른 솔루션을 가진 사람이 있습니까. (c#)

COM Interop은 특히 서버 환경에서 코드를 실행하려는 경우에 가장 적합한 솔루션이 아닙니다.

Office가 이 환경에서 실행될 때 불안정한 동작 및/또는 교착 상태가 나타날 수 있기 때문에 Microsoft는 현재 무인 비대화형 클라이언트 응용 프로그램 또는 구성 요소(ASP, ASP.NET, DCOM 및 NT 서비스 포함)에서 Microsoft Office 응용 프로그램의 자동화를 권장하지 않으며 지원하지도 않습니다.

또 다른 접근 방식은 해당 목적에 적합한 구성요소를 사용하는 것입니다.
저는 EEplus를 사용했고 그것은 더러운 일을 합니다.그것은 LGPL 라이선스를 가지고 있지만 저자는 당신이 그것을 당신의 상용 제품에 사용하는 것에 대해 걱정하는 것 같지 않습니다.

nuget 패키지를 설치하기만 하면 됩니다.

Install-Package EPPlus

다음 코드를 사용합니다.

using System.IO;
using OfficeOpenXml;

class Program
{
    static void Main(string[] args)
    {
        string csvFileName = @"FL_insurance_sample.csv";
        string excelFileName = @"FL_insurance_sample.xls";

        string worksheetsName = "TEST";

        bool firstRowIsHeader = false;

        var format = new ExcelTextFormat();
        format.Delimiter = ',';
        format.EOL = "\r";              // DEFAULT IS "\r\n";
        // format.TextQualifier = '"';

        using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFileName)))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
            worksheet.Cells["A1"].LoadFromText(new FileInfo(csvFileName), format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
            package.Save();
        }

        Console.WriteLine("Finished!");
        Console.ReadLine();
    }
}

사여용 CVS 조구있수를 사용하여 할 수 .ExcelTextFormat.

여기서 가져온 데이터로 테스트해봤습니다.

여기에서 샘플을 더 찾을 수 있습니다.

업데이트:

다른 옵션은 CSV 파일을 텍스트 파일로 직접 읽는 것입니다.

private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
    var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
    return (lines);
}

그리고 NPOI 또는 ClosedXML.NPOI ClosedX와 같은 다른 오픈 소스 프로젝트를 사용합니다.ML은 CSV를 읽고 변환을 수행할 수 없지만 함수를 사용합니다.ReadCsv당신은 스스로 할 수 있습니다.

이 두 프로젝트 모두 허가된 라이선스를 가지고 있습니다.

NPOI 변환:

private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    IWorkbook workbook = new XSSFWorkbook();
    ISheet worksheet = workbook.CreateSheet(worksheetName);

    foreach (var line in csvLines)
    {
    IRow row = worksheet.CreateRow(rowCount);

    colCount = 0;
    foreach (var col in line)
    {
        row.CreateCell(colCount).SetCellValue(TypeConverter.TryConvert(col));
        colCount++;
    }
    rowCount++;
    }

    using (FileStream fileWriter = File.Create(excelFileName))
    {
       workbook.Write(fileWriter);
       fileWriter.Close();
    }

    worksheet = null;
    workbook = null;

    return (true);
}

닫힌 XML 변환:

private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    using (var workbook = new XLWorkbook())
    {
    using (var worksheet = workbook.Worksheets.Add(worksheetName))
    {
        rowCount = 1;
        foreach (var line in csvLines)
        {
        colCount = 1;
        foreach (var col in line)
        {
            worksheet.Cell(rowCount, colCount).Value = TypeConverter.TryConvert(col);
            colCount++;
        }
        rowCount++;
        }

    }
    workbook.SaveAs(excelFileName);
    }

    return (true);
}

만약 누군가가 관심이 있다면, 세 제품을 비교하는 성능 테스트와 함께 샘플 프로젝트가 github에 있습니다.

OpenXML을 계속 진행하려면 다음과 같이 하면 됩니다.

너겟 패키지 설치

Install-Package DocumentFormat.OpenXml -Version 2.11.3

CSV 파일을 텍스트 파일로 직접 읽습니다(위 답변의 예).

private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
    var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
    return (lines);
}

OpenXML 코드:

private bool ConvertWithOpenXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
        {
            if (csvLines == null || csvLines.Count() == 0)
            {
                return (false);
            }
            using (SpreadsheetDocument package = SpreadsheetDocument.Create(excelFileName, SpreadsheetDocumentType.Workbook, true))
            {
                package.AddWorkbookPart();
                package.WorkbookPart.Workbook = new Workbook();
                package.WorkbookPart.AddNewPart<WorksheetPart>();
                SheetData xlSheetData = new SheetData();
                foreach (var line in csvLines)
                {
                    Row xlRow = new Row();
                    foreach (var col in line)
                    {
                        Cell xlCell = new Cell(new InlineString(new Text(col.ToString()))) { DataType = CellValues.InlineString };
                        xlRow.Append(xlCell);
                    }
                    xlSheetData.Append(xlRow);
                }
                package.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet(xlSheetData);
                package.WorkbookPart.WorksheetParts.First().Worksheet.Save();

            
                // create the worksheet to workbook relation
                package.WorkbookPart.Workbook.AppendChild(new Sheets());
                package.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet()
                {
                    Id = package.WorkbookPart.GetIdOfPart(package.WorkbookPart.WorksheetParts.First()),

                    SheetId = 1,

                    Name = worksheetName

                });

                package.WorkbookPart.Workbook.Save();
            }
            return (true);
        }

파일 맨 위에 다음 줄을 삽입합니다.

using Microsoft.Office.Interop.Excel;

여기에는 XlFileFormat 및 XlSaveAsAsAccessMode 클래스를 사용하는 데 필요한 네임스페이스가 포함됩니다.이 방법이 작동하지 않으면 프로젝트에 이 DLL에 대한 참조를 추가해야 할 수도 있습니다.

Close 메서드는 다음 인수를 사용합니다.

  1. 변경 내용 저장
  2. 파일 이름
  3. 경로 워크북

그것에 대한 설명서는 여기 있습니다.

도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/26648641/c-sharp-convert-csv-to-xls-using-existing-csv-file

반응형