Обрезать значения при экспорте WPF DataGrid в CSV - PullRequest
0 голосов
/ 25 февраля 2020

Я экспортирую значения таблицы данных WPF в CSV со следующим кодом:

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        DataGrid1.SelectAllCells();
        DataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        ApplicationCommands.Copy.Execute(null, DataGrid1);
        DataGrid1.UnselectAllCells();
        String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
        File.WriteAllText(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\" + "AllCustomersCSV.txt", result, UnicodeEncoding.UTF8);
    }

Однако результат имеет много пробелов после значений. Похоже на поведение WPF DataGrid. Я попытался добавить:

String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue.Trim());

, но это не похоже на работу. Что я делаю не так?

PS Я полагаю, это должно быть сделано с помощью l oop или List, поскольку он не может обрезать каждый из них отдельно в моей текущей настройке?


РЕДАКТИРОВАТЬ 1:

Вот пример вывода txt файла:

enter image description here


РЕДАКТИРОВАТЬ 2:

result пример вывода:

\tENERGIDIRETORAT                    \t                                   \tBOX 5091 MAJORSTUA                 \tN-0301   

Я думаю, мне нужно что-то вроде:

result = Regex.Replace(result, " *\t *", ",");

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

Таким образом, следует удалить все пробелы (табуляции) до \t, но оставить \t для замены на , (запятые).


РЕДАКТИРОВАТЬ 3:

У меня не работает экспорт CSV, поскольку, возможно, отсутствуют некоторые запятые, поскольку после импорта в Excel некоторые столбцы не совпадают. Я пошел для попытки формата файла xls. Кажется, это работает нормально (кодировка UTF8 была неверной, кстати):

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        DataGrid2.SelectAllCells();
        DataGrid2.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        ApplicationCommands.Copy.Execute(null, DataGrid2);
        String resultat = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
        String result = (string)Clipboard.GetData(DataFormats.Text);
        DataGrid2.UnselectAllCells();
        StreamWriter file1 = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\" + "SameCustomersCSV.xls",
    false, Encoding.GetEncoding("ISO-8859-1"));
        file1.WriteLine(result.Replace(',', ' '));
        file1.Close();

        MessageBox.Show(" Exporting data to Excel file to your Desktop is ready!");
    }

Я не совсем понимаю, в чем проблема с CSV ...

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Удалите все лишние пробелы или табуляции перед тем, как записать информацию, подобную этой:

var rawCSV = (string)Clipboard.GetData(DataFormats.Text);
var result = Regex.Replace(rawCSV, @"\s{2,}|\t", " ");

Что означает удаление двух или более пробелов или отдельной вкладки, а затем замените их одним пробелом .


var test = "a,   b, c,\t\td   ";

Regex.Replace(test, @"\s{2,}|\t", " ")

Replace возвращает строку a, b, c, d.

1 голос
/ 25 февраля 2020

Вы можете удалить вкладки, перебирая скопированные символы и записав все из них, кроме \t, в файл:

private void Button_Click(object sender, RoutedEventArgs e)
{
    DataGrid1.SelectAllCells();
    DataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
    ApplicationCommands.Copy.Execute(null, DataGrid1);
    DataGrid1.UnselectAllCells();

    string result = (string)Clipboard.GetData(DataFormats.Text);
    using (StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\" + "AllCustomersCSV.txt",
        false, Encoding.UTF8))
        foreach (char c in result)
            if (c != '\t')
                sw.Write(c);
            else
                sw.Write(",");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...