通过C#在Excel中打开CSV文件
本文关键字:CSV 文件 Excel 通过 | 更新日期: 2023-09-27 17:58:24
使用Max Galkin提供的解决方案,我完成了以下过程,将ListView中的所有数据传输到.CSV文件。然而,我有两个部分的问题:
- 当用户在适当的对话框上单击
YES
时,我还没有弄清楚如何成功打开新创建的.CSV - 似乎有些用户(在虚拟PC上,与我不同)无法打开或查看新文件,除非他们首先关闭应用程序。我相信这是由于应用程序仍然有一个与创建的文件绑定的进程。尝试打开文件时显示的消息为:
'FileName.csv' cannot be accessed. The file may be corrupted, located on a server that is not responding, or read-only.
这是我当前的代码:
private void btnCSVExcel_Click(object sender, EventArgs e)
{
if (!Directory.Exists(@"C:'TEMP'"))
{
Directory.CreateDirectory(@"C:'temp'");
}
if (!Directory.Exists(@"C:'temp'Exported CSV Files'"))
{
Directory.CreateDirectory(@"C:'temp'Exported CSV Files'");
}
string csvPath = @"C:'temp'Exported CSV Files'";
ListViewToCSV(lvData, csvPath, false);
}
// https://stackoverflow.com/questions/1008556/export-listview-to-csv
public static void ListViewToCSV(ListView listView, string filePath, bool includeHidden)
{
string csvFileName = filePath + DateTime.Now.ToString("yyyy-MM-dd-hh.mm.ss.ffffff") + ".csv";
//make header string
StringBuilder result = new StringBuilder();
WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listView.Columns[i].Text);
//export data rows
foreach (ListViewItem listItem in listView.Items)
{
WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listItem.SubItems[i].Text);
}
File.WriteAllText(csvFileName, result.ToString());
var openCSVFile = MessageBox.Show("Export Complete. CSV file saved as: " + csvFileName + ". 'n'n Open File Now?", "CSV Exported", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (openCSVFile == DialogResult.Yes)
{
// NEED TO OPEN THE CSV FILE IN EXCEL....?
File.Open(csvFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
}
private static void WriteCSVRow(StringBuilder result, int itemsCount, Func<int, bool> isColumnNeeded, Func<int, string> columnValue)
{
bool isFirstTime = true;
for (int i = 0; i < itemsCount; i++)
{
if (!isColumnNeeded(i))
continue;
if (!isFirstTime)
result.Append(",");
isFirstTime = false;
result.Append(String.Format("'"{0}'"", columnValue(i)));
}
result.AppendLine();
}
有人对我如何解决最后两个问题有什么想法吗?我认为File.Open()
可能足以解决第一个问题,但从视觉上看,什么都没有发生,文档也没有打开。
1)Excel将自己注册为.csv文件的默认处理程序。要使用该类型的默认文件处理程序打开任何文件,只需执行以下操作:
Process.Start(@"c:'full'path'to'file.csv");
2) File.WriteAllText
应该在最后关闭该文件。上面显示的代码还有一行读取File.Open(csvFileName...
,它以独占写入模式打开文件。由于您没有关闭该文件,Excel无法打开它,直到a)进程终止或b)文件被垃圾收集器关闭。我敢打赌,在出现拒绝访问错误的情况下,垃圾收集器还没有运行。
最后建议:删除File.Open
并替换为Process.Start
,您可能会看到不同的结果。
您需要在项目中添加对Microsoft Excel Interop库的引用:
using Excel = Microsoft.Office.Interop.Excel;
然后您可以使用以下代码打开CSV文件:
static void OpenCSVWithExcel(string path)
{
var ExcelApp = new Excel.Application();
ExcelApp.Workbooks.OpenText( path, Comma:true);
ExcelApp.Visible = true;
}