Я бьюсь головой об этом.

У меня есть лист Excel с 994 строками, но при экспорте в CSV я получаю 1880 строк в текстовом формате!

И, конечно, теперь, когда я пытаюсь воссоздать исходный файл Excel, я получаю 1880 строк.

Кто-нибудь может сказать мне, что здесь происходит?


Я только что нашел источник проблемы:

Исходный файл содержит возврат каретки внутри ячеек, и при экспорте в текстовый формат эти возврат каретки преобразуются в новые строки.

Теперь самое интересное: текстовый файл переведен, и мне нужно повторно импортировать переведенный файл в Excel, воссоздав формат ***. Кто-нибудь знает, как я мог это сделать?

2 ответа2

1

Я наконец-то решил проблему самостоятельно. Вот ответ для целей документации:

Причина:

Некоторые ячейки содержали разрывы строк. При экспорте в CSV разрывы строк были преобразованы в новые строки, которые не были восстановлены при повторном импорте файла в Excel, что привело к гораздо большему количеству строк, чем в оригинале.

Решение:

Напишите небольшое приложение, которое заставляет каждую строку содержать столько же символов табуляции, что и исходный файл. Если строка не содержит ожидаемого количества вкладок, добавляйте следующую строку до тех пор, пока не будет достигнуто нужное количество вкладок. Вставьте заполнитель, чтобы отметить места, где были внутренние разрывы строк. После обработки откройте в Excel, проверьте количество строк, затем найдите и замените заполнитель на разрыв строки (Alt+010).

Вот код C #: он использует 2 элемента управления richtextbox:

    public void restoreLines{
    int nbTabs = 0;
    int nbPrevTabs = 0;
    int totalTabs = 0;
    int lineNb = 0;
    string content = "";

    string sSource = rtbSrc.Text;
    string[] lines = Regex.Split(sSource, "µ");
    foreach (string line in lines)
    {
        lineNb++;
        nbTabs = line.Length - line.Replace("\t", "").Length;
        totalTabs = nbPrevTabs + nbTabs;
        if (totalTabs == 15)
        {
            content += line.TrimEnd() + "##µ##";
                nbTabs = 0;
                nbPrevTabs = 0;
            totalTabs = 0;
        }
        else if (totalTabs > 15)
        {
            MessageBox.Show("Line #" + lineNb + " contains " + totalTabs + " tabs");
            break;
        }
        else
        {
            content += line.TrimEnd() + "##InnerCRLF##";
            nbPrevTabs += nbTabs;
            nbTabs = 0;
        }
    }
    rtbRTF.Text = content;

}

Это, очевидно, быстрое и грязное решение, но оно выполняет свою работу и может быть относительно легко адаптировано для обработки других файлов, страдающих от той же проблемы.

0

У меня была та же проблема, и я исправил ее, изменив порядок функций (нужно сначала автоматически подгонять столбцы, а затем применить перенос текста) в моем коде, это было так

objWorksheet.Cells["A1"].LoadFromDataTable (dtSrc, true);
objWorksheet.Cells.Style.Font.SetFromFont (new Font ("Calibri", 10));
objWorksheet.Cells["J:J"].Style.WrapText = true; 
objWorksheet.Cells.AutoFitColumns ();

Затем я изменил это на это:

objWorksheet.Cells["A1"].LoadFromDataTable (dtSrc, true);
objWorksheet.Cells.Style.Font.SetFromFont (new Font ("Calibri", 10));
objWorksheet.Cells.AutoFitColumns ();
objWorksheet.Cells["J:J"].Style.WrapText = true; 

Я надеюсь, что это поможет кому-то, кто хочет создать файл Excel и сохранить новую строку

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .