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

2024-01-11

我正在创建一个将数据写入现有 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;
    }

}

}


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

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

编辑1:澄清问题后:

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

  1. 写入以逗号分隔的 .csv 文件,您可以通过 C# 应用程序控制对该文件的读/写访问。
  2. 在引用您的 .csv 文件的 Excel 电子表格“来自文本”中添加“外部数据源”。来源:https://support.office.com/en-us/article/Import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba https://support.office.com/en-us/article/Import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba在“通过连接来导入文本文件”部分下。
  3. 在“数据”选项卡的“连接”标题下,您想要更改“属性”以经常刷新或在打开文件时刷新。如果您不会每次都更改文件名,我会取消选中“刷新时提示输入文件名”框。

希望这对你有用。如果您需要更多说明,请再次发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • ASP.NET Web Api 2 - 子域属性路由

    我一直在使用属性路由 http attributerouting net 在我的 MVC 应用程序中已经有一段时间了 然而 它始终缺少的一件事是 Web Api 中的子域路由 该库中的其他功能可与 MVC 配合使用 但不能与 Web Api
  • 从 phantomjs“SyntaxError: Parse error”消息获取更多信息

    我有一个很长的剧本 不是我写的 当我运行它时 我得到 phantomjs file js SyntaxError Parse error 我查看了手册和帮助 我能想到的最好的办法是 phantomjs debug yes file js i
  • jQuery,检查是否选择了所有单选按钮组

    我有几个单选按钮组 当检查它们时我需要运行一个脚本 我使用以下脚本来检查其中之一是否被选中 如果没有 则将其着色 我该如何编写代码 以便在检查所有单选按钮组时 然后运行脚本 检查单选按钮组是否被选中的代码 aQuestion each fu
  • Doctrine/Symfony 查询生成器在左连接上添加选择

    我有一个与作者表相关的帖子表 这两个表都与第三个表 喜欢 相关 该表指示哪些用户喜欢哪些帖子 我想选择作者和喜欢的帖子 但不知道如何在获取结果后访问连接的对象 我的查询生成器如下所示 result em gt createQueryBuil
  • 如何使用原始转义序列解析字符串?

    假设有2个字符串 string parse const string s how to write this function int main string s1 R hello n this is a string with escap
  • akka-stream + akka-http 生命周期

    TLDR 当我有一个传出的 http 请求作为流的一部分时 每个请求实现一个流 即使用短期流 还是跨请求使用单个流实现更好 详细信息 我有一个典型的服务 它接受 HTTP 请求 将其分散到多个第三方下游服务 不受我控制 并在将结果发送回之前
  • 使用与领域实体的一对一接口是好还是坏做法?为什么?

    我在我开发的一些 DDD 企业应用程序中看到的一件事是使用与域实体相同的接口 以及属性和功能的一对一映射 事实上 域对象始终通过其一对一接口来使用 并且所有域实体都具有这种风格的一对一接口 例如 域对象帐户 public class Acc
  • 在 Spark Scala 中读取二进制文件

    我需要从二进制文件中提取数据 I used binaryRecords并得到RDD Array Byte 从这里我想将每条记录解析为case class Field1 Int Filed2 Short Field3 Long 我怎样才能做到
  • Html5 data-* 与 asp.net mvc TextboxFor html 属性

    我该如何添加data 使用 TextboxFor 的 html 属性 这就是我目前所拥有的 Html TextBoxFor model gt model Country CountryName new data url Url Action
  • .js 文件可以“包含”另一个 .js 文件吗[重复]

    这个问题在这里已经有答案了 在 PhP 中你可以 在 html 中 你可以使用
  • Jenkins 构建抛出内存不足错误

    我们让 Jenkins 在 ec2 实例上运行 在进行构建时 我们看到以下错误 17 29 39 149 INFO org gradle api Project OpenJDK 64 Bit Server VM warning INFO o
  • 使用 @RequestMapping 匹配 URL 模式

    它非常类似于this https stackoverflow com questions 14856149 spring request mapping matching with url pattern问题 但我只是不知道如何匹配 url
  • python subprocess.call() 找不到 Windows Bash.exe

    我有一个程序 它从另一个在 Linux 的新 Windows 子系统上运行的程序获取输出 我编写了一个从 Windows 系统运行的 python 程序 但将使用 python subprocess 模块执行 linux 程序 如果这令人困
  • 哪一段代码性能更好?

    我正在审查一些代码 用于将一些文本转换为MD5 Hash 效果很好 它用于创建一个MD5Hhash for a 头像 头像 这里是 static MD5CryptoServiceProvider md5CryptoServiceProvid
  • django 从连接到任何网络的任何计算机访问本地主机

    我有一个 Django 项目 正在 localhost 8000 上运行 并且运行良好 现在我希望它可以从连接到其他网络的任何计算机进行访问 做了一些谷歌 我发现我可以通过从路由器设置端口转发来做到这一点 我有一个 tplink 路由器 我
  • 寻找具有选择条件的最便宜的物品组合

    假设我有 3 个特定商品的卖家 每个卖家存储的此类物品数量不同 该商品也有不同的价格 Name Price Units in storage Supplier 1 17 1 Unit Supplier 2 18 3 Units Suppli
  • AWS TimeStream:超过一天的记录将被拒​​绝

    我在AWS TimeStream中创建了一个数据库表 其内存保留期为7天 但是 当我尝试上传 3 天前的数据时 它将被拒绝 似乎只接受超过 24 小时的数据 2020 10 26T13 43 33 244 01 00 Rejected a
  • 如何从 python 脚本在 azure devops 管道中生成合理的错误消息

    我在构建管道中使用 python 对拉取请求运行一些检查 当检查失败时 我使用sys exit reason 退出脚本 这可行 但输出没有帮助 PR 页面中显示的内容如下 进程 C hostedtoolcache windows Pytho
  • JavaScript 复制到剪贴板不起作用

    我的脚本中有一个函数给我一个错误 该功能的目的是通过 onClick 事件从静态面板 不是文本框或输入 复制文本 未捕获的类型错误 copyText select 不是函数 我想要的是让用户能够单击文本并将其复制到剪贴板 也许你可以提供更好
  • 当现有的 Excel 文件在桌面上**打开**时,是否可以写入该文件?

    我正在创建一个将数据写入现有 Excel 文件的代码 仅当文件关闭时它才会读 写文件 如果我尝试在桌面上打开该文件时写入该文件 它将不会更改或保存该文档 当代码运行之前或运行期间打开 Excel 文件时 我也无法关闭工作簿 使用 close