Search code examples
c#csvexport-to-csvepplus

Converting XLSX file using to a CSV file


I need to convert an XLSX file to another CSV file. I've done a lot of research on how to do this process, but I did not find anything that suited me. I found this Github Gist only Convert an Epplus ExcelPackage to a CSV file

That returns an Array of binary. But apparently it does not work any more.

I'm trying to load Array using LoadFromCollection

FileInfo novoArquivoCSV = new FileInfo(fbd.SelectedPath);
var fileInfoCSV = new FileInfo(novoArquivo + "\\" + nameFile.ToString() + ".csv");

using (var csv = new ExcelPackage(fileInfoCSV))
{
    csv.Workbook.Worksheets.Add(nameFile.ToString());
    var worksheetCSV = csv.Workbook.Worksheets[1];

    worksheetCSV.Cells.LoadFromCollection(xlsx.ConvertToCsv());
}

Solution

  • The code you linked to reads an XLSX sheet and returns the CSV data as a byte buffer through a memory stream.

    You can write directly to a file instead, if you remove the memory stream and pass the path to the target file in ConvertToCsv :

    public static void ConvertToCsv(this ExcelPackage package, string targetFile)
    {
            var worksheet = package.Workbook.Worksheets[1];
    
            var maxColumnNumber = worksheet.Dimension.End.Column;
            var currentRow = new List<string>(maxColumnNumber);
            var totalRowCount = worksheet.Dimension.End.Row;
            var currentRowNum = 1;
    
            //No need for a memory buffer, writing directly to a file
            //var memory = new MemoryStream();
    
            using (var writer = new StreamWriter(targetFile,false, Encoding.UTF8))
            {
            //the rest of the code remains the same
            }
    
            // No buffer returned
            //return memory.ToArray();
    }
    

    Encoding.UTF8 ensures the file will be written as UTF8 with a Byte Order Mark that allows all programs to understand this is a UTF8 file instead of ASCII. Otherwise, a program could read the file as ASCII and choke on the first non-ASCII character encountered.