Преобразование Excel в CSV с добавлением C # в каждой строке

#c#

#c#

Вопрос:

Я конвертирую файл Excel в CSV в Azure WebJob, чтобы сохранить файл в хранилище больших двоичных объектов во время процесса с использованием C #, но получаю дополнительную запятую после каждой строки в моем csv-файле.

Пример:

1, Тест, Doe, 2, Тест, Джон,

Вот мой код для создания CSV-файла:

 public static class ExcelToCSVConvertor
{
    public static List<BlobInput> Convert(List<BlobOutput> inputs)
    {
        var dataForBlobInput = new List<BlobInput>();
        try
        {
            foreach (BlobOutput item in inputs)
            {
                using (SpreadsheetDocument document = SpreadsheetDocument.Open(item.BlobContent, false))
                {
                    foreach (Sheet _Sheet in document.WorkbookPart.Workbook.Descendants<Sheet>())
                    {
                        WorksheetPart _WorksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(_Sheet.Id);
                        Worksheet _Worksheet = _WorksheetPart.Worksheet;

                        SharedStringTablePart _SharedStringTablePart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
                        SharedStringItem[] _SharedStringItem = _SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ToArray();

                        StringBuilder stringBuilder = new StringBuilder();
                        foreach (var row in _Worksheet.Descendants<Row>())
                        {
                            foreach (Cell _Cell in row)
                            {
                                string Value = string.Empty;
                                if (_Cell.CellValue != null)
                                {
                                    if (_Cell.DataType != null amp;amp; _Cell.DataType.Value == CellValues.SharedString)
                                        Value = _SharedStringItem[int.Parse(_Cell.CellValue.Text)].InnerText;
                                    else
                                        Value = _Cell.CellValue.Text;
                                }
                                
                                stringBuilder.Append(string.Format("{0},", Value.Trim()));

                            }
                            stringBuilder.Append("n");
                        }

 
                        byte[] data = Encoding.UTF8.GetBytes(stringBuilder.ToString().Trim());
                        string fileNameWithoutExtn = item.BlobName.ToString().Substring(0, item.BlobName.ToString().IndexOf("."));
                        string newFilename = $"{fileNameWithoutExtn}_{_Sheet.Name}.csv";
                        dataForBlobInput.Add(new BlobInput { BlobName = newFilename, BlobContent = data });
                    }
                }
            }
        }
        catch (Exception Ex)
        {
            throw Ex;
        }
        return dataForBlobInput;
    }        
}
 

Комментарии:

1. Рассматривали ли вы возможность использования for цикла вместо foreach цикла по ячейкам строки? Если вы измените … foreach (Cell _Cell in row) … на … for (int i = 0 , i < row.Cells.Count; i ) {…} Тогда… в каждой итерации… Запишите значение ячейки, затем if оператор для запятой … if (i < row.Cells.Count – 1) { //add a comma }

Ответ №1:

В этой строке добавляется запятая после КАЖДОГО отдельного значения stringBuilder.Append(string.Format("{0},", Value.Trim())); 1, Test, Doe, 2, Test, John,

Вам нужно исключить запятую в последнем значении в строке (последняя итерация). На последней итерации foreach (ячейка _Cell в строке) StringBuilder .Добавление должно быть stringBuilder.Append(string.Format("{0}", Value.Trim()));