C# .NET에서 프로그래밍을 통해 CSV를 Excel XLSX로 변환하는 방법
페이지 정보
작성자 MESCIUS 작성일 2023-11-23 11:46 조회 34회 댓글 0건본문
첨부파일
관련링크
XLSX 및 텍스트 기반 CSV(쉼표로 구분된 값)는 데이터 상호 교환을 위한 공통 파일 형식입니다.
이러한 파일 형식의 읽기 및 쓰기 지원을 구현하면 응용 프로그램은 상당한 이점을 얻을 수 있습니다.
이 예제에서는 아래의 내용을 진행할 것입니다.
- 최신 월간 Bitcoin-US Dollar 시장 데이터를 CSV 형식으로 다운로드
- 해당 CSV 데이터를 플랫폼 전반에서 작동하는 C# Web Service Application으로 가지고 오기
- 해당 데이터를 포함하는 새 XLSX 스프레드시트를 차트 및 추세선이 있는 표 형식으로 생성해 이동 평균 분석
웹 응용 프로그램은 표준 Open Object XML(OOXML) 스프레드시트 파일을 읽는 스프레드시트 응용 프로그램이라면 어디에서든 열 수 있는 XLSX 스프레드시트를 반환합니다.
데이터를 가져오기 위한 웹 서비스(코드 예제 사용할 무료 API 키를 받으려면 링크 따라가기) 및 CSV 데이터 가져오기가 기본적으로 지원되는 DsExcel를 사용합니다.
표, 차트 등이 포함된 새 스프레드시트를 생성하고 다음 단계에 따라 새 XLSX을 내보냅니다.
프로젝트 만들기
Visual Studio 2022를 사용하여 새 프로젝트(CTRL+SHIFT+N)를 만들겠습니다.
드롭다운에서 C#, All Platforms, WebAPI를 선택합니다.
ASP.NET Core Web API 프로젝트 유형을 찾아 선택하고 다음을 클릭합니다.
[그림 1] Visual Studio 2022에서 새 ASP.NET Core Web API 프로젝트 만들기
프로젝트 이름으로 BTC_Chart_WebService를 입력하고 프로젝트 위치를 선택한 후 다음을 클릭합니다.
[그림 2] Visual Studio 2022에서 새 ASP.NET Core Web API 프로젝트 구성
프레임워크로 .NET 6.0(Long-term-support) 이상을 선택합니다.
대화 상자에서 다른 구성에 대해 기본값이 선택된 상태로 다음을 클릭합니다.
[그림 3] Framework 대상 구성
일기 예보를 반환하는 샘플 코드가 포함된 ASP.NET Core WebAPI 템플릿이 생성됩니다.
이 프로젝트에서는 필요하지 않지만 컨트롤러를 재사용하고, 용도를 변경할 수도 있습니다.
솔루션 탐색기(CTRL+ALT+L)를 사용하겠습니다.
프로젝트에서 컨트롤러 파일(컨트롤러 아래에 있음)의 이름을 BTCChartController.cs로 변경합니다.
[그림 4] 컨트롤러에서 WeatherForecastController.cs 파일의 이름을 BTCChartController.cs로 변경
파일 이름을 변경하면 Visual Studio에는 프로젝트의 코드 참조를 모두 변경할지 묻는 프롬프트가 나타납니다.
대화 상자에서 예(YES)를 클릭합니다.
[그림 5] 코드 참조 이름 변경 - 여기서 예 클릭
그런 다음 WeatherForecast.cs 프로젝트 파일을 선택하여 프로젝트에서 삭제(DEL)합니다.
정말로 삭제할지 묻는 대화 상자에서 예(OK)를 클릭합니다.
[그림 6] 프로젝트에서 WeatherForecast.cs 삭제 확인
이제 솔루션 탐색기(CTRL+ALT+L)에서 종속성을 마우스 오른쪽 버튼으로 클릭합니다.
NuGet 패키지 관리를 선택합니다.
[그림 7] 솔루션 탐색기 종속성에서 NuGet 패키지 관리 열기
NuGet.org에서 GrapeCity.Documents.Excel을 검색하여 프로젝트에 최신 버전(6.2.0 이상)을 설치합니다.
데이터 쿼리
솔루션 탐색기(CTRL+ALT+L)에서 편집할 BTCChartController.cs 파일을 선택합니다.
일기 예보와 관련된 요약 코드를 주석 처리합니다.
BTCChartController
public class BTCChartController : ControllerBase { // private static readonly string[] Summaries = new[] // { // "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" //};
GetCSVData
// Get the CSV data from the AlphaVantage web service private string GetCsvData() { string csv; string API_KEY = "YOUR_KEY_HERE"; string QUERY_URL = $"https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_MONTHLY&symbol=BTC&market=USD&apikey={API_KEY}&datatype=csv"; Uri queryUri = new Uri(QUERY_URL); using (HttpClient client = new HttpClient()) { Task<string> t = client.GetStringAsync(queryUri); while (!t.IsCompleted) t.Wait(); csv = t.Result; } return csv; }
이제 Get() 메서드의 코드를 다음 코드 조각으로 바꿉니다.
이는 다음을 수행합니다.
HttpGet 속성의 이름을 GetBTC-USDChartWorkbook으로 업데이트
반환 유형을 FileContentResult로 변경
일기 예보와 관련된 코드 주석 처리
GetCsvData()를 호출하는 코드를 추가하고 새 통합 문서로 가져오기
BTCChartController.Get
[HttpGet(Name = "GetBTC-USDChartWorkbook")] //public IEnumerable<WeatherForecast> Get() public FileContentResult Get() { //return Enumerable.Range(1, 5).Select(index => new WeatherForecast //{ // Date = DateTime.Now.AddDays(index), // TemperatureC = Random.Shared.Next(-20, 55), // Summary = Summaries[Random.Shared.Next(Summaries.Length)] //}) //.ToArray(); // first get CSV data string csv = GetCsvData(); // create new workbook IWorkbook wbk = new Workbook(); // open CSV data in GcExcel using MemoryStream using (Stream s = new MemoryStream()) { // convert to byte array using UTF8 encoding byte[] arr = System.Text.Encoding.UTF8.GetBytes(csv.ToCharArray()); s.Write(arr); s.Seek(0, SeekOrigin.Begin); // open CSV in workbook wbk.Open(s, OpenFileFormat.Csv); }
※ 참고: GrapeCity.Documents.Excel에 대한 어셈블리 참조는 자동으로 BTCChartController.cs 파일에 추가됩니다.
CSV 처리
통합 문서에서 CSV를 처리하기 위해 다음 코드를 복사합니다.
이전 코드 조각의 using 블록 다음입니다.
BTCChartController.Get
// get the worksheet with the CSV data IWorksheet wks = wbk.Worksheets[0]; // move volume to column B, before open/high/low/close // it works better to create the StockVOHLC chart with // the series in the correct order (date-volume-open-high-low-close) wks.Range["B:B"].Insert(); wks.Range["K:K"].Copy(wks.Range["B:B"]); wks.Range["K:K"].Delete(); // get the range containing the CSV data IRange used = wks.UsedRange; // create a new Table for the CSV data named "BTC_Monthly" ITable tbl = wks.Tables.Add(used, true); tbl.Name = "BTC_Monthly"; // auto-fit the columns in the table to show all the cell values used.AutoFit(); // add the StockVOHLC chart shape over the table (the table is completely beneath the chart) IShape shape = wks.Shapes.AddChart(ChartType.StockVOHLC, 0, 0, used.Width, used.Height); // get the IChart from the shape IChart chart = shape.Chart; // set the chart title chart.ChartTitle.Text = "BitCoin Monthly Open-High-Low-Close-Volume"; // add the chart series (the first 6 columns in the table) chart.SeriesCollection.Add(wks.Range[0, 0, used.RowCount, 6], RowCol.Columns, true, true); // change category axis base to months IAxis categoryAxis = chart.Axes.Item(AxisType.Category); categoryAxis.BaseUnit = TimeUnit.Months; // change category axis tick label orientation and number format categoryAxis.TickLabels.Orientation = 45; categoryAxis.TickLabels.NumberFormat = "d/m/yyyy"; // add trend line for Volume series in Blue ITrendline voltrend = chart.SeriesCollection[0].Trendlines.Add(); voltrend.Name = "3 Month Moving Avg VOL"; voltrend.Type = TrendlineType.MovingAvg; voltrend.Period = 3; voltrend.Format.Line.Color.RGB = Color.Blue; voltrend.Format.Line.DashStyle = LineDashStyle.RoundDot; // add trend line for High series in Green ITrendline hightrend = chart.SeriesCollection[2].Trendlines.Add(); hightrend.Name = "3 Month Moving Avg HIGH"; hightrend.Type = TrendlineType.MovingAvg; hightrend.Period = 3; hightrend.Format.Line.Color.RGB = Color.Green; hightrend.Format.Line.DashStyle = LineDashStyle.RoundDot; // add trend line for Low series in Red ITrendline lowtrend = chart.SeriesCollection[3].Trendlines.Add(); lowtrend.Name = "3 Month Moving Avg LOW"; lowtrend.Type = TrendlineType.MovingAvg; lowtrend.Period = 3; lowtrend.Format.Line.Color.RGB = Color.Red; lowtrend.Format.Line.DashStyle = LineDashStyle.RoundDot;
먼저, 이 코드는 CSV 데이터가 포함된 워크시트를 가지고 와 열을 재정렬합니다.
Volume열을 Data열과 Open열 사이에 배치합니다.
그런 다음 CSV 데이터가 포함된 BTC_Monthly라는 테이블을 생성하고 테이블의 열을 자동으로 맞춥니다.
그러면 코드는 전체 테이블 범위에 걸쳐 워크시트에 StockVOHLC 유형(거래량-시가-고가-저가-종가)의 새 차트를 추가합니다.
차트 제목을 설정하고, 시리즈를 차트에 추가하고, 범주 축 단위를 월로 변경합니다.
다음으로 범주 축 눈금 레이블 방향 및 숫자 형식을 업데이트한 후 세 개의 추세선을 생성합니다.
추세선은 볼륨에 대한 3개월 이동 평균을 파란색으로, 고가는 녹색, 저가는 적색으로 표시합니다.
XLSX 반환
마지막으로 이전 코드 뒤에 하단의 코드를 복사합니다.
통합 문서를 XLSX로 저장하고 웹 서비스에서 반환합니다.
// Save Workbook to XLSX and return from web service as "BTC_Chart.xlsx" using (MemoryStream ms = new MemoryStream()) { wbk.Save(ms, SaveFileFormat.Xlsx); ms.Seek(0, SeekOrigin.Begin); byte[] bytes = ms.ToArray(); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "BTC_Chart.xlsx"); } } // Get()
프로젝트가 완료되었으며 실행할 준비가 끝났습니다!
F5를 눌러 디버그 모드를 실행하고 테스트해 볼 수 있습니다.
[그림 8] F5를 눌러 디버그에서 BTC_Chart_WebService 실행
드롭 다운을 열고 사용해 보기를 클릭합니다.
[그림 9] 사용해 보기를 눌러 웹 서비스 테스트
실행을 클릭하면 성공 결과와 함께 XLSX 파일 다운로드 링크가 바로 나타납니다.
[그림 10] 성공 결과 및 XLSX 파일 다운로드 링크
결과 차트는 다음과 같이 Excel 파일로 표시됩니다.
지금 바로 DsExcel .NET을 다운로드하여 직접 테스트해 보세요!
댓글목록
등록된 댓글이 없습니다.