C#,想了很久的问题,解决了给100分,不知道有人能解决不!

时间:2021-04-12 21:53:15
C#
在程序中我只做一个按扭.用途是:
如果指定的的excel文件中的数据有变动(如c:\count.xsl),我只要在本程序按扭上点击保存,那么就能保存改动的内容?而不使用excel自带的"文件\保存"方式.这个可以实现吗?高人指点,解决了给100分

再次说明,excel中的数据不是这个程序本身改动的,而是打开excel表格后手动修改的.我只是想用自己做的安扭来保存它.

也不是"另存为",是直接保存在原excel里面.

52 个解决方案

#1


用程序?好像是不可以吧.除非你在程序里面改,再保存.

你直接改excel又要用程序按钮来保存,怎么感觉像脱下裤子来放屁呀,呵呵.

#2


Excel 文件是有你的程序打开的还是由别人打开的?
要是你自己的程序打开的,倒是很简单啊

#3


关注……

#4


自己的程序打开的怎么做?别的程序打开的又怎么做?

#5


声明 一个Excel.ApplicationClass ,使其指向你的要保存的Excel,然后调用它的保存方法

#6


如果是自己打开的,可以用楼上的方法。这里给一个例子参考一下:
http://dotnet.aspx.cc/article/13c874e4-7fc7-4fd1-8cf6-de9ef4469a9c/read.aspx

#7


可以!

#8


问题是你写的时候
excel已经帮你保存了
好像每几秒就自动保存一次

#9


这样子做有什么用处啊?

#10


除非你读内存,应该不可能.
因为Excel改动后是临时放在内存里的,你的程序可以读到Excel使用的内存部分不?

#11


Excel.ApplicationClass 解决

#12


http://support.microsoft.com/kb/311452/zh-cn

里面有很多东西,不只是对SAVE的操作,VBA能实现的C#都能实现。

#13


http://support.microsoft.com/kb/306023/
比如这篇是讲用C#向EXCEL传输数据的,其中就有一步SAVE操作.

#14


有一点难. 我记得以前是这么解决的, 但是首先你要知道当前打开这个excel的进程ID.然后获取这个进程的句柄. C#里面调用这个进程的save 方法

就是Excel.Application能启动的那个进程. 比较麻烦. 不过你的思路满有创意的, 一点用都没有的function.

#15


如果是自己的程序打开的, 那你就在打开时遍历一下所有的单元格, 在保存时再遍历一下所有的单元格, 保存不一样的好了

当然, 所有的单元格也并不是全部, 那样程序真累死了, 用一下Excel.WorkSheet.UsedRange限定一下使用的单元格范围, 不过万一真的有变态在IV65535单元格做个改动, 那就等死吧

#16


1、获取Excel的进程
2、给Excel SendKey Ctrl+S
3、搞定

#17


进程之间的通讯,难

#18


0 0
咦 ...
上面的好像还简单

Process 获取Excel 把焦点给他 ..
然后模拟 Ctrl + S

#19


有意思的想法.....

隔一个时间给Excel发个保存命令.

#20


up

#21


帮顶,学习

#22


光有一个按钮恐怕不行,如果你打开很多个Excel,要保存其中一个的话,你只有依靠一个listbox来选中你要的那个Excel。这样估计就可以解决的。

#23


mark~

#24


可以实现,最好你的Excel文件也是用程序打开的。
private void m_save()
{
private Excel.ApplicationClass ExcelApp;
private Excel.Workbook Workbook;
private Excel.Worksheet Worksheet;

ExcelApp = new Excel.ApplicationClass();

//打开指定文件
Workbook = ExcelApp.Workbooks.Open(path,
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value);

//保存
Workbook.Save();

}
若是手动打开文件,程序就可能不能再次打开文件了。
你试试。

#25


其实我想这样的,通过程序向excel插入数据,然后通过excel的公式自动计算功能,将插入的数据通过一定的公式来计算出结果,然后在通过程序读取其结果保存到sql2000数据库中!所有的问题都可以解决,包括你打开excel后都能看到计算出的结果,但是这个结果只是计算了,并没有保存(因为读取到的结果不是看到的结果,而是上次最后一次保存的结果,所以我想能不能通过程序来保存数据.

#26


忘记了一句,在整个操作过程中,都不要打开excel.只是想借用一下excel的计算功能

#27


有没人能解决啊?

#28


其实真正懂程序的人才知道,这个并不仅仅只是一个保存的问题.
首先让我们来模拟一下.下面是我们具备的东西:
a.exe      //你自己写的程序
Excel.exe  //微软办公软件
test.xls   //测试用的excel表格文件

第一步:用a.exe打开test.xls;
第二步:用Excel.exe打开test.xls;
第三步:在Excel.exe中对test.xls进行修改操作;
第四步:在a.exe中对test.xls进行保存操作,并且能保存Excel.exe对test.xls的修改结果!

好了,你认为这可以实现吗?

a.exe和Excel.exe是两个独立的程序,如果a.exe不能读取Excel.exe的内存,那么a.exe是怎么知道Excel.exe对test.xls作了哪些修改呢?

如果还不能弄明白,那么这里倒有一个很简单的例子:
第一步:新建一个文件文件test.txt
第二步:用记事本打开test.txt
第三步:用Word打开test.txt
第四步:在记事本中修改test.txt(比如写几个字进去)
第五步: 在Word中点击保存按纽

朋友,你认为test.txt的内容会被改变吗?

#29


忘记了一句,在整个操作过程中,都不要打开excel.只是想借用一下excel的计算功能
===========================

你的想法倒是很有"旁门左道"的味道,嘿嘿.
只是什么算法在C#中实现不了,非要用Excel呢?
虽然直接用Excel的算法或许是会简单点,但付出的代价太大了,
所以建设你这条"左道"还是别走了,在C#中多写几行代码问题总能解决的.

#30


To:Boxter110:
如何 “给Excel SendKey Ctrl+S”?

#31


TO:zjmotion(旁门左道) 
讲的很有道理

不过,程序的难点就是这些算法是经常变动的,算法每变动一次就只需要替换excel就可以了,这样就不去修改程序了.而且这些计算公式只需要使用人员拟订就可以了

#32


1。不是不能做到的,ms有种叫codemaker技术,不过好像不外传,他本来就作在office里面,有什么消息会发出来。不过当时没有研究过,因为觉得更本自己用不到。

#33


我们当时做.net 2007测试,也是外部程序获得.net的准备信息,不过类库上层已经给我们做好了,下层就是codemarker。

#34


不过,程序的难点就是这些算法是经常变动的,算法每变动一次就只需要替换excel就可以了,这样就不去修改程序了.而且这些计算公式只需要使用人员拟订就可以了
==============
你要使用Excel的算法,你就必须打开Excel表.
对Excel表的数据进行计算是Office办公软件来完成的,并不是因为它是一个xls文件就可以只向它插入一行数据它就能计算出结果.
你可以用自己的程序对xls文件插入数据并保存.但你不用Excel去打开这个文件,它的计算事件就无法触发.

#35


各位兄弟,那请问还有没有其他可行方法?

#36


关注

#37


各位兄弟,那请问还有没有其他可行方法?

#38


关注

#39


其实,关键在于能否实现像Excel一样可以让用户自己写公式.
查查资料先~

#40


要是这样的话,楼主应当采用从Excel读取公式,然后将公式转化成为c#中的算法,最后还是用C#来计算。

Excel起到的只是一个图形化公式编辑器的作用。

不知道我是否理解了楼主的意思!

#41


to:litaoye()
能不能在具体点,比如怎样从Excel读取公式?

#42


to:litaoye()
能不能在具体点,比如怎样从Excel读取公式?
--------------------
看来楼主有点病急乱投医了,呵呵.
现在的难点不在于公式的编写,而是在于如何在C#执行自定义的公式.
比如在程序界面放置一个文本框和一个按纽,在文本框里输入"2*5-6+4",那么点击按纽后能否让C#执行"2*5-6+4"得到最终结果8呢?
如果能实现的话,何必还要先把公式写进Excel表,再从Excel表里读取公式再来计算?这不是绕弯子吗?

#43


Excel 里写宏,,,,   在C#里调动

#44


支持+up

#45


第一,能利用excel已有的强大的计算功能,
第二,不必要用c#写复杂的公式就能计算.简化程序.
第三,excel计算公式可以必要由编程人员来编写.用户自己在excel中就可以编写公式,然后保存在本地,作为模板,每要计算一次就可以调用一次模板.

#46


楼主还是没明白问题出在哪里.
现在的难点不是从excel获取公式,可是怎么样让C#执行获取的公式?
这样说吧,假设你现在已经从excel表里获取到了这样一个公式:"1*987-54+56"
那么,我想问你,这个公式对你有什么用?
所以,问题的关键在于如何让C#认得"1*987-54+56"是一个公式并按逻辑关系计算出来.

#47


c#中有一个监视硬盘中的文件是否发生改变!
当excel变化后,保存!

#48


读取公式需要先取到range

比如:

Microsoft.Office.Interop.Excel.Range range1 = xSheet.get_Range("B1", Type.Missing);

range1.Formula
range1.FormulaArray

都是跟公式有关的。

另外我试过了,当你用C#填写完了数值,并保存之后,是可以直接通过range的value2读取计算结果的,你所说的读不到,会不会跟顺序有关?一定要填写完所有数据之后再读。

#49


给你一段简单的代码:

Microsoft.Office.Interop.Excel.Application xApp = new ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook xBook = xApp.Workbooks._Open(@"c:\1.xls",
Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Microsoft.Office.Interop.Excel.Worksheet xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xBook.Sheets[1];

Microsoft.Office.Interop.Excel.Range rng1 = xSheet.get_Range("B1", Type.Missing);
Microsoft.Office.Interop.Excel.Range rng2 = xSheet.get_Range("A1", Type.Missing);

rng2.Value2 = 10;
xBook.Save();
this.textBox1.Text = rng1.Value2.ToString();

其中B1里面是一个公式,=SUM(A:A)
当我替换了A1里面的值后,马上就能读取到B1值的变化。

#50


to:zjmotion(旁门左道)

c#能够计算Excel的公式(至少能算一部分),同样是调用Microsoft.Office.Interop.Excel,随便自定义一个Range,然后按照下面的方法就能计算。


rng1.Formula = "=SUM(A:A)*100/80";
rng1.Calculate();
value = rng1.Value2.ToString();

其中value就是计算后的结果。不保存xsl同样能得到计算结果,这样对本来的文件也没有改动。

#1


用程序?好像是不可以吧.除非你在程序里面改,再保存.

你直接改excel又要用程序按钮来保存,怎么感觉像脱下裤子来放屁呀,呵呵.

#2


Excel 文件是有你的程序打开的还是由别人打开的?
要是你自己的程序打开的,倒是很简单啊

#3


关注……

#4


自己的程序打开的怎么做?别的程序打开的又怎么做?

#5


声明 一个Excel.ApplicationClass ,使其指向你的要保存的Excel,然后调用它的保存方法

#6


如果是自己打开的,可以用楼上的方法。这里给一个例子参考一下:
http://dotnet.aspx.cc/article/13c874e4-7fc7-4fd1-8cf6-de9ef4469a9c/read.aspx

#7


可以!

#8


问题是你写的时候
excel已经帮你保存了
好像每几秒就自动保存一次

#9


这样子做有什么用处啊?

#10


除非你读内存,应该不可能.
因为Excel改动后是临时放在内存里的,你的程序可以读到Excel使用的内存部分不?

#11


Excel.ApplicationClass 解决

#12


http://support.microsoft.com/kb/311452/zh-cn

里面有很多东西,不只是对SAVE的操作,VBA能实现的C#都能实现。

#13


http://support.microsoft.com/kb/306023/
比如这篇是讲用C#向EXCEL传输数据的,其中就有一步SAVE操作.

#14


有一点难. 我记得以前是这么解决的, 但是首先你要知道当前打开这个excel的进程ID.然后获取这个进程的句柄. C#里面调用这个进程的save 方法

就是Excel.Application能启动的那个进程. 比较麻烦. 不过你的思路满有创意的, 一点用都没有的function.

#15


如果是自己的程序打开的, 那你就在打开时遍历一下所有的单元格, 在保存时再遍历一下所有的单元格, 保存不一样的好了

当然, 所有的单元格也并不是全部, 那样程序真累死了, 用一下Excel.WorkSheet.UsedRange限定一下使用的单元格范围, 不过万一真的有变态在IV65535单元格做个改动, 那就等死吧

#16


1、获取Excel的进程
2、给Excel SendKey Ctrl+S
3、搞定

#17


进程之间的通讯,难

#18


0 0
咦 ...
上面的好像还简单

Process 获取Excel 把焦点给他 ..
然后模拟 Ctrl + S

#19


有意思的想法.....

隔一个时间给Excel发个保存命令.

#20


up

#21


帮顶,学习

#22


光有一个按钮恐怕不行,如果你打开很多个Excel,要保存其中一个的话,你只有依靠一个listbox来选中你要的那个Excel。这样估计就可以解决的。

#23


mark~

#24


可以实现,最好你的Excel文件也是用程序打开的。
private void m_save()
{
private Excel.ApplicationClass ExcelApp;
private Excel.Workbook Workbook;
private Excel.Worksheet Worksheet;

ExcelApp = new Excel.ApplicationClass();

//打开指定文件
Workbook = ExcelApp.Workbooks.Open(path,
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value);

//保存
Workbook.Save();

}
若是手动打开文件,程序就可能不能再次打开文件了。
你试试。

#25


其实我想这样的,通过程序向excel插入数据,然后通过excel的公式自动计算功能,将插入的数据通过一定的公式来计算出结果,然后在通过程序读取其结果保存到sql2000数据库中!所有的问题都可以解决,包括你打开excel后都能看到计算出的结果,但是这个结果只是计算了,并没有保存(因为读取到的结果不是看到的结果,而是上次最后一次保存的结果,所以我想能不能通过程序来保存数据.

#26


忘记了一句,在整个操作过程中,都不要打开excel.只是想借用一下excel的计算功能

#27


有没人能解决啊?

#28


其实真正懂程序的人才知道,这个并不仅仅只是一个保存的问题.
首先让我们来模拟一下.下面是我们具备的东西:
a.exe      //你自己写的程序
Excel.exe  //微软办公软件
test.xls   //测试用的excel表格文件

第一步:用a.exe打开test.xls;
第二步:用Excel.exe打开test.xls;
第三步:在Excel.exe中对test.xls进行修改操作;
第四步:在a.exe中对test.xls进行保存操作,并且能保存Excel.exe对test.xls的修改结果!

好了,你认为这可以实现吗?

a.exe和Excel.exe是两个独立的程序,如果a.exe不能读取Excel.exe的内存,那么a.exe是怎么知道Excel.exe对test.xls作了哪些修改呢?

如果还不能弄明白,那么这里倒有一个很简单的例子:
第一步:新建一个文件文件test.txt
第二步:用记事本打开test.txt
第三步:用Word打开test.txt
第四步:在记事本中修改test.txt(比如写几个字进去)
第五步: 在Word中点击保存按纽

朋友,你认为test.txt的内容会被改变吗?

#29


忘记了一句,在整个操作过程中,都不要打开excel.只是想借用一下excel的计算功能
===========================

你的想法倒是很有"旁门左道"的味道,嘿嘿.
只是什么算法在C#中实现不了,非要用Excel呢?
虽然直接用Excel的算法或许是会简单点,但付出的代价太大了,
所以建设你这条"左道"还是别走了,在C#中多写几行代码问题总能解决的.

#30


To:Boxter110:
如何 “给Excel SendKey Ctrl+S”?

#31


TO:zjmotion(旁门左道) 
讲的很有道理

不过,程序的难点就是这些算法是经常变动的,算法每变动一次就只需要替换excel就可以了,这样就不去修改程序了.而且这些计算公式只需要使用人员拟订就可以了

#32


1。不是不能做到的,ms有种叫codemaker技术,不过好像不外传,他本来就作在office里面,有什么消息会发出来。不过当时没有研究过,因为觉得更本自己用不到。

#33


我们当时做.net 2007测试,也是外部程序获得.net的准备信息,不过类库上层已经给我们做好了,下层就是codemarker。

#34


不过,程序的难点就是这些算法是经常变动的,算法每变动一次就只需要替换excel就可以了,这样就不去修改程序了.而且这些计算公式只需要使用人员拟订就可以了
==============
你要使用Excel的算法,你就必须打开Excel表.
对Excel表的数据进行计算是Office办公软件来完成的,并不是因为它是一个xls文件就可以只向它插入一行数据它就能计算出结果.
你可以用自己的程序对xls文件插入数据并保存.但你不用Excel去打开这个文件,它的计算事件就无法触发.

#35


各位兄弟,那请问还有没有其他可行方法?

#36


关注

#37


各位兄弟,那请问还有没有其他可行方法?

#38


关注

#39


其实,关键在于能否实现像Excel一样可以让用户自己写公式.
查查资料先~

#40


要是这样的话,楼主应当采用从Excel读取公式,然后将公式转化成为c#中的算法,最后还是用C#来计算。

Excel起到的只是一个图形化公式编辑器的作用。

不知道我是否理解了楼主的意思!

#41


to:litaoye()
能不能在具体点,比如怎样从Excel读取公式?

#42


to:litaoye()
能不能在具体点,比如怎样从Excel读取公式?
--------------------
看来楼主有点病急乱投医了,呵呵.
现在的难点不在于公式的编写,而是在于如何在C#执行自定义的公式.
比如在程序界面放置一个文本框和一个按纽,在文本框里输入"2*5-6+4",那么点击按纽后能否让C#执行"2*5-6+4"得到最终结果8呢?
如果能实现的话,何必还要先把公式写进Excel表,再从Excel表里读取公式再来计算?这不是绕弯子吗?

#43


Excel 里写宏,,,,   在C#里调动

#44


支持+up

#45


第一,能利用excel已有的强大的计算功能,
第二,不必要用c#写复杂的公式就能计算.简化程序.
第三,excel计算公式可以必要由编程人员来编写.用户自己在excel中就可以编写公式,然后保存在本地,作为模板,每要计算一次就可以调用一次模板.

#46


楼主还是没明白问题出在哪里.
现在的难点不是从excel获取公式,可是怎么样让C#执行获取的公式?
这样说吧,假设你现在已经从excel表里获取到了这样一个公式:"1*987-54+56"
那么,我想问你,这个公式对你有什么用?
所以,问题的关键在于如何让C#认得"1*987-54+56"是一个公式并按逻辑关系计算出来.

#47


c#中有一个监视硬盘中的文件是否发生改变!
当excel变化后,保存!

#48


读取公式需要先取到range

比如:

Microsoft.Office.Interop.Excel.Range range1 = xSheet.get_Range("B1", Type.Missing);

range1.Formula
range1.FormulaArray

都是跟公式有关的。

另外我试过了,当你用C#填写完了数值,并保存之后,是可以直接通过range的value2读取计算结果的,你所说的读不到,会不会跟顺序有关?一定要填写完所有数据之后再读。

#49


给你一段简单的代码:

Microsoft.Office.Interop.Excel.Application xApp = new ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook xBook = xApp.Workbooks._Open(@"c:\1.xls",
Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Microsoft.Office.Interop.Excel.Worksheet xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xBook.Sheets[1];

Microsoft.Office.Interop.Excel.Range rng1 = xSheet.get_Range("B1", Type.Missing);
Microsoft.Office.Interop.Excel.Range rng2 = xSheet.get_Range("A1", Type.Missing);

rng2.Value2 = 10;
xBook.Save();
this.textBox1.Text = rng1.Value2.ToString();

其中B1里面是一个公式,=SUM(A:A)
当我替换了A1里面的值后,马上就能读取到B1值的变化。

#50


to:zjmotion(旁门左道)

c#能够计算Excel的公式(至少能算一部分),同样是调用Microsoft.Office.Interop.Excel,随便自定义一个Range,然后按照下面的方法就能计算。


rng1.Formula = "=SUM(A:A)*100/80";
rng1.Calculate();
value = rng1.Value2.ToString();

其中value就是计算后的结果。不保存xsl同样能得到计算结果,这样对本来的文件也没有改动。