C# csv를 xls로 변환(기존 csv 파일 사용)
저는 이 문제에 대해 많은 논의가 있다고 믿습니다.하지만 나는 모든 게시물을 읽고 시도했지만 그것은 결코 c#에서 작동하지 않습니다. 나의 목표는 내가 기존의 csv 파일을 가지고 있다는 것입니다.단지 엑셀 파일을 변환하고 완료하기를 원합니다. 많은 사람들이 첨탑을 사용하여 그렇게 말했습니다.xls 뭔가 하지만 나는 ms.office를 믿습니다.interop.accips는 그것을 처리할 수 있었습니다.
나는 위의 이슈를 읽었고 이것은 나의 문제와 같습니다.하지만 위의 코드는 내 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 메서드는 다음 인수를 사용합니다.
- 변경 내용 저장
- 파일 이름
- 경로 워크북
그것에 대한 설명서는 여기 있습니다.
도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/26648641/c-sharp-convert-csv-to-xls-using-existing-csv-file
'it-source' 카테고리의 다른 글
npm 피어 종속성을 자동으로 설치하는 방법은 무엇입니까? (0) | 2023.06.25 |
---|---|
오라클 호출 저장 프로시저 내부 선택 (0) | 2023.06.25 |
기본 웹 브라우저에서 URL 열기 (0) | 2023.06.25 |
C#에서 MongoDB Bson 문서를 유효한 JSON으로 변환 (0) | 2023.06.25 |
Axios put 요청 문제 (0) | 2023.06.25 |