将listview的内容保存为c#中的CSV文件

时间:2015-01-06 23:53:53

标签: c#

我有一个独立的c#应用程序,其列表视图显示我的程序读取的数据。 我将它保存为excel文件它工作得很好,但保存的数据全部转储到列中,我已经尝试将其保存为csv文件,但我不能让它做我想要的让每个不同的在一个单独的列上请任何抬头都非常欢迎 这就是我的输出设计方式,我想在打开excel文件时每个都应该在一个单独的列上。

   listView1.Items.Add(vis.brand+ "," + (vis.Count) + ","vis.model + "," + Math.Round(vis.sum));

2 个答案:

答案 0 :(得分:1)

您可以使用this示例,选择C#版本。

它应该完全符合您的要求。这个功能可以解决这个问题:

    private void Button1_Click(object sender, EventArgs e)
    {
        //declare new SaveFileDialog + set it's initial properties
            SaveFileDialog sfd = new SaveFileDialog {
                Title = "Choose file to save to",
                FileName = "example.csv",
                Filter = "CSV (*.csv)|*.csv",
                FilterIndex = 0,
                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            //show the dialog + display the results in a msgbox unless cancelled

            if (sfd.ShowDialog() == DialogResult.OK) {

                string[] headers = ListView1.Columns
                           .OfType<ColumnHeader>()
                           .Select(header => header.Text.Trim())
                           .ToArray();

                string[][] items = ListView1.Items
                            .OfType<ListViewItem>()
                            .Select(lvi => lvi.SubItems
                                .OfType<ListViewItem.ListViewSubItem>()
                                .Select(si => si.Text).ToArray()).ToArray();

                string table = string.Join(",", headers) + Environment.NewLine;
                foreach (string[] a in items)
                {
                    //a = a_loopVariable;
                    table += string.Join(",", a) + Environment.NewLine;
                }
                table = table.TrimEnd('\r', '\n');
                System.IO.File.WriteAllText(sfd.FileName, table);
            }
    }

答案 1 :(得分:0)

@McRonald的答案主要涵盖了它,但对于重要的边缘情况会失败。

如果您在任何字符串中都有逗号或引号,则会使输出变得混乱。例如,如果你有一个包含LastName和FirstName列的CSV,那么后缀为&#34;,Jr&#34;会丢掉逗号:

LastName, FirstName
Smith, John
Baker, Jr, Fred

我开发了一种扩展方法,可以将任何必要的转义应用到正在写入CSV文件单元格的字符串中(代码可以缩短,但最容易按照书面形式进行操作):

static public class CsvExtensions
{
    static public string CsvQuote(this string text)
    {
        if (text == null)
        {
            return string.Empty;
        }

        bool containsQuote = false;
        bool containsComma = false;
        bool containsNewline = false;
        bool containsCR = false;
        int len = text.Length;
        for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++)
        {
            char ch = text[i];
            if (ch == '"')
            {
                containsQuote = true;
            }
            else if (ch == ',')
            {
                containsComma = true;
            }
            else if (ch == '\r')
            {
                containsCR = true;
            }
            else if (ch == '\n')
            {
                containsNewline = true;
            }
        }

        bool mustQuote = containsComma || containsQuote || containsCR || containsNewline;

        if (containsQuote)
        {
            text = text.Replace("\"", "\"\"");
        }

        if (mustQuote)
        {
            return "\"" + text + "\"";  // Quote the cell and replace embedded quotes with double-quote
        }
        else
        {
            return text;
        }
    }

}

您可以将所有代码放在自己的类中,然后像这样使用它(从@McRonald的答案中获取一行代码):

table += string.Join(",", a) + Environment.NewLine;

变为

table += string.Join(",", a.CsvQuote()) + Environment.NewLine;