在C#中使用StreamWriter时,编写以.csv或Excel文件分隔的不同选项卡或文件

时间:2015-09-21 15:54:11

标签: c# excel csv visual-studio-2012 streamwriter

我有一个控制台应用程序,可将结果输出到.csv文件中。控制台应用程序调用多个Web服务并输出多个数据。输出包含区分一个站点与另一个站点的URL。代码工作正常,但输出在一个大的CSV文件中,当它到达标题时它会被分割,然后开始从新站点写入数据。

现在,您可以了解CSV文件中的输出结果:

ProjectTitle,PublishStatus,Type,NumberOfUsers, URL
Project one,published,Open,1,http://localhost/test1
Project two,expired,Closed,14,http://localhost/test1

ProjectTitle,PublishStatus,Type,NumberOfUsers,URL
Project one V2,expired,Closed,2,http://localhost/test2
Project two V2,Published,Open,3,http://localhost/test2

我想要做的是输出第一组数据(取决于每个URL),然后输出Excel中不同选项卡中的第二组数据,或者只是为新数据集创建一个新文件。我的代码:

public static XmlDocument xml = new XmlDocument();

static void Main(string[] args)
{
    xml.Load("config.xml");
    test();            
}

private static void test()
{

List<string> url = new List<string>();
int count = xml.GetElementsByTagName("url").Count;

for (int i = 0; i < count; ++i)
{
    url.Add(xml.GetElementsByTagName("url")[i].InnerText);

    Url = url[i];               

}

string listFile = "ListOfSites";
string outCsvFile = string.Format(@"C:\\testFile\\{0}.csv", testFile + DateTime.Now.ToString("_yyyyMMdd HHmms"));


using (FileStream fs = new FileStream(outCsvFile, FileMode.Append, FileAccess.Write))                    
using (StreamWriter file = new StreamWriter(fs))

file.WriteLine("ProjectTitle,PublishStatus,Type,NumberOfSUsers,URL");
    foreach(WS.ProjectData proj in pr.Distinct(new ProjectEqualityComparer()))
        {
            file.WriteLine("{0},\"{1}\",{2},{3},{4}",
            proj.ProjectTitle,                               
            proj.PublishStatus,                               
            proj.type,
            proj.userIDs.Length.ToString(NumberFormatInfo.InvariantInfo),
            url[i].ToString());
        }
}

2 个答案:

答案 0 :(得分:1)

这是一个快速修复。可能还有一种更优雅的方式来实现这一目标:

public static XmlDocument xml = new XmlDocument();

static void Main(string[] args)
{
    xml.Load("config.xml");

    // relocated from `test` method to `Main`
    List<string> url = new List<string>();
    int count = xml.GetElementsByTagName("url").Count;

    for (int i = 0; i < count; ++i)
    {
        url.Add(xml.GetElementsByTagName("url")[i].InnerText);

        Url = url[i];               
        test(Url);
    }

}

private static void test(string url)
{
    string listFile = "ListOfSites";
    string outCsvFile = string.Format(@"C:\\testFile\\{0}.csv", testFile + DateTime.Now.ToString("_yyyyMMdd HHmms"));


    using (FileStream fs = new FileStream(outCsvFile, FileMode.Append, FileAccess.Write))           
    {
        using (StreamWriter file = new StreamWriter(fs))
        {
            file.WriteLine("ProjectTitle,PublishStatus,Type,NumberOfSUsers,URL");
        foreach(WS.ProjectData proj in pr.Distinct(new ProjectEqualityComparer()))
            {
                file.WriteLine("{0},\"{1}\",{2},{3},{4}",
                proj.ProjectTitle,                               
                proj.PublishStatus,                               
                proj.type,
                proj.userIDs.Length.ToString(NumberFormatInfo.InvariantInfo),
                url);
            }
        }
    }         
}

注意:即使您不需要,也请在C#中使用大括号。它使您的代码更具可读性。

答案 1 :(得分:1)

如果您想编写带有不同工作表的Excel文件,您可以尝试使用EpPlus库,它是开源的,免费的。

Here is the nuget page

要生成更多文件,您必须决定如何命名它们,如果每个文件的记录在源列表中是随机的,您可以为不同的输出文件生成不同的输出字符串列表并使用File.AppendAllLines(filename ,收藏);将数据保存在不同的文件中。我不建议您打开和关闭要写入的每一行的文件,因为这是耗费时间和资源的操作。