在桌面上打开**时,是否可以写入现有的Excel文件?

时间:2017-02-27 16:57:29

标签: c# excel

我想要创建一个将数据写入现有Excel文件的代码。它仅在文件关闭时才会读/写文件。如果我在桌面上打开文件时尝试写入文件,则不会更改或保存文档。在代码运行之前或代码运行时打开Excel文件时,我也无法关闭工作簿(使用.close())或退出应用程序(使用.quit())。

我是否有办法在excel文件在桌面上打开并实际显示更改时写入?或者我可以至少关闭已打开的文件读/写,保存并使用C#代码再次打开它?这是我正在使用的代码;它有点无组织,但如果你运行它,你可以看到我本来想要做的事情。请不要更改要保存文件的属性地址,以便代码工作(通用地址保存为名为excelsource的字符串变量)。代码将首先创建一个以今天的月份和日期(MM_YY)命名的文件。每次初始化代码时它都会继续写入。如果在新创建的文件打开时尝试写入文件,则不会对文件应用任何更改(仅在文件关闭时写入excel文件)。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication4
{
class Program
{
    static public string excelsource = @"\user\desktop\generic\";
    // excelsource is the "general" address of where excel file wil be saved.
    static public bool truth;
    static public bool truth1;
    static public bool scan_thru = false;
    static public int range2;
    static public int index = 1;
    static Excel.Application excel = new Excel.Application();
    static Excel.Workbook workbook;
    static Excel.Worksheet sheet;
    static Excel.Range range;
    static FileInfo file;

    static void Main(string[] args)
    {
        DateTime current_time = DateTime.Now;
        string file_name = excelsource + current_time.Month.ToString() + "_" + current_time.Year.ToString() + ".xlsx";
        string curfile = file_name;
        truth = File.Exists(curfile);
        // truth determines if file exists if truth == true file exists and does not need to be created, if false a new file is created.
        if (truth == false)
        {
            workbook = excel.Workbooks.Add();
            sheet = workbook.Sheets[1];
            sheet.Name = (current_time.Month.ToString() + "_" + current_time.Day + "_" + current_time.Year);
        }
        else
        {
            file = new FileInfo(file_name);
            truth1 = IsFileinUse(file);
            // truth1 determines if the existing file is open; truth1 == false if the file is currently closed and is true when it is open.
            workbook = excel.Workbooks.Open(file_name);
            sheet = workbook.Sheets[current_time.Month.ToString() + "_" + current_time.Day + "_" + current_time.Year];
            if (truth1 == true)
            {
                excel.Visible = false;
                excel.DisplayAlerts = false;
                workbook.Save();
            }
            while (scan_thru == false & truth1 == false)
                {
                string box = "A" + index.ToString();
                    range = sheet.get_Range(box, Missing.Value);
                    string range1 = range.Text;
                    bool judge = int.TryParse(range1, out range2);
                    if (judge == true)
                    {
                        index++;
                    }
                    else
                    {
                        scan_thru = true;
                    }
                }
                scan_thru = false;

        }
            int i = index;
            while (i < (index + 100) & truth1 == false)
            {
                sheet.Cells[i, "A"].Value2 = i.ToString();                   
                i++;
            }


            if (truth == false)
            {
                workbook.SaveAs(file_name);
            }
            if (truth == true & truth1 == false)
            {
                excel.DisplayAlerts = false;
            }
            index = 1;
            workbook.Close(true);
            excel.Quit();

    }
    protected static bool IsFileinUse(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            return true;
        }
        finally
        {
           if (stream != null)
                stream.Close();
        }
        return false;
    }

}

}

2 个答案:

答案 0 :(得分:1)

很有可能从C#应用程序无法做到这一点。当文件在Excel中打开时,它会阻止来自其他应用程序的写入访问,以维护打开的文件中的数据完整性。这意味着您应该具有只读访问权限。

此外,强制打开和关闭来自外部应用程序的任何应用程序很少是更新文件的最佳方法。如果您要修改当前打开的文件中的数据,您应该学习如何编写Excel宏。

  

编辑1:澄清问题后:

您无法添加到打开的Excel文件。但是,如果我正确理解你的问题,我认为这将解决你的问题(我试过它,它适用于我):

  1. 写入以逗号分隔的.csv文件,您可以从C#应用程序控制读/写访问权限。
  2. 在excel电子表格“From Text”中添加“外部数据源”,该文件引用您的.csv文件。来源:https://support.office.com/en-us/article/Import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba位于“通过连接到它来导入文本文件”部分。
  3. 在“数据”选项卡的“连接”标题下,您希望更改“属性”以便经常刷新或打开文件时。如果您不是每次都更改文件名,我会取消选中“刷新时提示文件名”框。
  4. 希望这适合你。如果您需要更多说明,请再次发表评论。

答案 1 :(得分:0)

该线程非常老。但是我面临着同样的问题。我想写一个.csv文件,而它是在桌面上从外部打开的。问题是Excel将文件锁定为在读/写模式下使用,因此我的应用程序抛出了“文件已在使用中错误”。因此,要解决此问题,在台式机上进行外部访问时,必须以只读模式打开文件。如果要通过应用程序创建.csv文件,请以只读模式创建该文件。而且,当您要在其上进行写入时,请将该实例转换为读写模式,并在写入后将其转换回只读模式。因此,您可以在后台打开.csv文件,以显示所有数据。但是,必须重新打开它才能获取在后台打开文件时可能已写入文件的更新数据。  我用来转换为读/写和只读的代码:

// Convert to Read-Write
File.SetAttributes(FileName, File.GetAttributes(FileName) & ~FileAttributes.ReadOnly);                
// Write to the .csv File
// Convert back to Read only
File.SetAttributes(FileName, System.IO.FileAttributes.ReadOnly);