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

我有一个控制台应用程序将结果输出到.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中的另一个选项卡中输出第二组数据,或者只是为新的数据集创build一个新文件。 我的代码:

 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()); } } 

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

这是nuget页面

要生成更多的文件,您必须决定如何命名它们,如果每个文件的logging在源列表中是随机的,则可以为不同的输出文件生成不同的输出string列表,并使用File.AppendAllLines(文件名,集合) ; 将数据保存在不同的文件中。 我不build议您打开和closures要写入的每一行的文件,因为这是耗费时间和资源的操作。

这是一个快速修复。 可能还有一个更好的方法来完成这个任务:

 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#中的大括号。 它使您的代码更具可读性。