C# 控制excel文档写入写出

塔克茜丝 2020-01-07 01:23:52
工作中经常要在excel文档中写入内容。
请问如何用C#控制excel文档写入写出?
本人新手,请高手指点。
比如:需要using什么?电脑需要先安装什么?
是否有扫盲贴共享?谢谢
...全文
411 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
CarBot 2020-06-01
  • 打赏
  • 举报
回复
引用 3 楼 塔克茜丝的回复:
[quote=引用 2 楼 weixin_28996651 的回复:]
我做了一个用NPOI实现的excel文件读取、生成需要数据、存储数据的小程序,需要的话可以找我~

你好,是否有相关的文档可以分享和参考?谢谢。[/quote] 可以的,我们这都用这个来处理复杂的数据,很简单,具体可以私信我要联系方式
彭佳煜1 2020-05-29
  • 打赏
  • 举报
回复
我是小白 为什么我的 public void ExitApplication()这个函数里面的out int k提示我int表达式无效
The 祺℡ 2020-05-26
  • 打赏
  • 举报
回复
因为打开操作是:_xlWorkBook = _xlApplication.Workbooks.Add("xls"); 针对的是_xlWorkBook,所以关闭的时候也是针对_xlWorkBook,调用_xlWorkBook.Save()就行,原路径保存。要换位置的话,再用SaveAs. 说一下层次关系: 1. _xlApplication: 简单理解就是Office Excel应用程序,只是用来打开你的xls和xlsx。单纯的new一个_xlApplication,里面是不会有内容的。 2. Workbooks:就是_xlApplication里面的工作簿(xls或xlsx文件集合),一个_xlApplication,可以打开,也就是Add多个Workbook(xls或xlsx文件)。 3. Workbook:对应你的单个xls或xlsx文件。 4. WorkSheet: 单个xls或xlsx文件里面的某一个sheet。
塔克茜丝 2020-05-26
  • 打赏
  • 举报
回复
多谢,多谢!后面会单开贴,询问相关的细节问题。记得回复哈,这就结贴给分。
The 祺℡ 2020-05-26
  • 打赏
  • 举报
回复
1. 是的,_xlApplication.Workbooks.Add("xls"); 括号里替换成你excel文件的绝对路径就行。 2. xlWorkSheet = _xlWorkBook.Sheets.get_Item(1); _xlWorkSheet.Select(); 这两个连一起用,对于有多页sheet的Excel表格,要先选中你要操作的那一张Sheet进行读写操作。也就是设置活动sheet。后面的xlWorkSheet.Cells[1, 1].Value就针对的活动sheet而言。 3. Range和Cells的区别在于,Cell表示的是某一个sheet里面唯一的一个单元格,而Range可以表示多个单元格的集合,比如说:_xlWorkSheet.Range["A1:B2"],_xlWorkSheet.Range["A1:B2, C1:D4"]。比如“合并单元格”、“设置单元格底色”等操作,就是针对的Range,而不是Cell。此处而言,并无区别。 4. ExitApplication(); 是强制结束Excel进程,没有保存的操作。如果要保存,请在关闭前调用 _xlWorkBook.Save(); 5. DllImport是C#调用Window C/C++函数的基本操作,扫盲:https://www.cnblogs.com/wwwbdabc/p/11653243.html,C# COM 提供的退出方式是_xlApplication.Quit();但是这个关不干净,总会有Excel进程残留,所有我这里用调用了一下Window库,先获取_xlApplication ID,然后在进程里面用System.Diagnostics.Process.GetProcessById(k).Kill();强制杀死。 6. 如果你有多个excel文件要操作,_xlApplication = new Microsoft.Office.Interop.Excel.Application()和ExitApplication();在开头和结束的时候执行一次就行了。不用每次都启动Excel应用。
塔克茜丝 2020-05-26
  • 打赏
  • 举报
回复
为了这个新开了一个prj,尝试可以了。
发现了代码几个问题:
_xlApplication = new Microsoft.Office.Interop.Excel.Application
{
Visible = false, //Excel应用是否可见,如果这个选false,后台运行的话
WindowState = XlWindowState.xlMinimized,
//Excel窗口弹出状态,下面这个要选min,如果还是原来的max,还是会跳出excel。
DisplayAlerts = false //是否允许Excel弹出警告
};
The 祺℡兄,给的代码,是没有保存的
我找到了这个_xlWorkSheet.SaveAs(excelpath);实测有效,还有其他解决方法么?
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
引用 4 楼 jhonsonzhang 的回复:
我就简单的请求楼主反思一个问题,微软自己的东西,还需要借助第三方吗?
最最简单的思路,excel里面有个宏,叫vba,你录制保存以后,vba的代码转换为c#的就可以了。这都是我十多年前使用过的思路,供您参考。

我这里的需求很简单,就是我有好几个excel文档,上面是有固定模板,我只需要在特定的几个地方获取数据就好。
这几个excel我会邮件发给别人填写,返回我之后,我想通过软件对其中的数据进行检查。
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
_xlWorkBook = _xlApplication.Workbooks.Add("xls"); //对应你的Excel模板路径
-----"XLS", 1. 这里可以输入excel文档的绝对路径,就行了是吧。
_xlWorkSheet = _xlWorkBook.Sheets.get_Item(1); //1, 表示要操作第一个Sheet,Excel所有索引都是从1开始编号的
_xlWorkSheet.Select();----2.这条代码什么作用?看解释里面是 对象的替换?

_xlWorkSheet.Cells[1, 1].Value = "MyValue"; //设置单元格文字, 或者 这个cell理解,定位到唯一的那个cell
_xlWorkSheet.Range["A1"].Value = "MyValue"; //这2个是一个功能。

string myValue1 = _xlWorkSheet.Range["A1"].Text; //获取单元格文字, 或者
string myValue2 = _xlWorkSheet.Cells[1, 1].Text;

ExitApplication(); ---然后就直接关闭应用了?excel已经修改完了?


//先 using System.Runtime.InteropServices;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
-----这里有什么相关知识分享么?DIIImport
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);

//完全退出
public void ExitApplication()
{
_xlApplication.Quit();
GetWindowThreadProcessId(new IntPtr(_xlApplication.Hwnd), out int k);
System.Diagnostics.Process.GetProcessById(k).Kill();
}
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
1. Visible = true, 就是表示这个Excel应用是可见的,就是可以看得见。如果设置成false, 就相当于后台静默操作,任务栏是不会显示的,但是进程里面可以看见。 2. WindowState,只有在 Visible = true的时候才有意义。你理解的很对。 3. DisplayAlerts,比如咱正常的操作excel,只要修改了内容但是又没有手动保存,在关闭应用的时候都会提示你“是否保存修改?”,如果这个设置成false,那就不会提示这个了。对于后台操作的excel,建议设置为flase。
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
没有报错了,麻烦详细解释下
_xlApplication = new Microsoft.Office.Interop.Excel.Application
{
Visible = true, //Excel应用是否可见
------ 这是可见不可见是什么意思?就是可以看到桌面上有一个新打开的excel么?最后的效果?是否可以选false?
WindowState = XlWindowState.xlMaximized, //Excel窗口弹出状态 ---如果上面选false,这步是否就可以无所谓
DisplayAlerts = false //是否允许Excel弹出警告 ----这个是什么警告?
};
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
_xlWorkBook = _xlApplication.Workbooks.Add("xls"); 括号里面的"xls"要改成你自己的excel文件路。全路径,相对路径不行。这种方式相当于“打开” 如果是新建一个Excel文档,用的是_xlWorkBook = _xlApplication.Workbooks.Add(true);
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
再添加一个引用:项目->添加引用->COM->找到“Microsoft Office 16.0 Object Library”,互操作类型是TRUE。“Microsoft Excel 16.0 Object Library”这个也改成TRUE,刚我记错了。 程序里面: using Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices;
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
我加分了,请一定帮忙,理解下一个小白的苦处...低级问题不停,基础不好。
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
引用 10 楼 塔克茜丝 的回复:
搞定,一定给分 程序里面引用 using Microsoft.Office.Interop.Excel 之后, 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS0104 '“ListBox”是“Microsoft.Office.Interop.Excel.ListBox”和“System.Windows.Forms.ListBox”之间的不明确的引用 Certification Auxiliary F:\Program\C#\projects\Certification Auxiliary\Form1.cs 138 活动 这个是什么问题?
就是表示System.Windows.Forms和Microsoft.Office.Interop.Excel库里面都用定义ListBox这个类。 很简单,找到138行,用全名替代就行。将ListBox改成System.Windows.Forms.ListBox或者Microsoft.Office.Interop.Excel.ListBox,具体看你是哪一个了。 你这20分不好拿呀...
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
搞定,一定给分
程序里面引用 using Microsoft.Office.Interop.Excel 之后,
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS0104 '“ListBox”是“Microsoft.Office.Interop.Excel.ListBox”和“System.Windows.Forms.ListBox”之间的不明确的引用 Certification Auxiliary F:\Program\C#\projects\Certification Auxiliary\Form1.cs 138 活动
这个是什么问题?
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
引用 8 楼 塔克茜丝 的回复:
不好意思,低级失误。添加的时候,要先在前面打钩,才会加入... 选中,直接点确定是没用的。找到了...
无碍,小白是不会被嘲笑的,采纳不给分才会被嘲笑。
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
不好意思,低级失误。添加的时候,要先在前面打钩,才会加入...
选中,直接点确定是没用的。找到了...
塔克茜丝 2020-05-25
  • 打赏
  • 举报
回复
2. 引用 -> 添加引用 -> COM -> 找到“Microsoft Excel 16.0 Object Library”, 我这边时Office2016,对应版本时16,有可能时其他数字,关系不大。
3. 解决方案视图找到Microsoft.Office.Interop.Excel,右键属性,嵌入互操作类型设置未False,程序里面引用 using Microsoft.Office.Interop.Excel;

我是VS2019,在项目->添加引用->COM->找到“Microsoft Excel 16.0 Object Library”,添加了
解决方案视图找到Microsoft.Office.Interop.Excel,右键属性,嵌入互操作类型设置未False,程序里面引用 using Microsoft.Office.Interop.Excel
这个没找到,在解决方案视图中查看引用,里面有个microsoft.csharp,里面的属性有..嵌入互操作类型设置未False.
我为了确认是不是同一个,把microsoft.csharp删除了...然后重新添加excel,然后这个csharp也不出现了。。。
本人小白,问的问题很幼稚,低级,见笑了,望不吝赐教,谢谢。
The 祺℡ 2020-05-25
  • 打赏
  • 举报
回复
1. 电脑装Excel 2. 引用 -> 添加引用 -> COM -> 找到“Microsoft Excel 16.0 Object Library”, 我这边时Office2016,对应版本时16,有可能时其他数字,关系不大。 3. 解决方案视图找到Microsoft.Office.Interop.Excel,右键属性,嵌入互操作类型设置未False,程序里面引用 using Microsoft.Office.Interop.Excel; 4. 接下来教你怎么设置和修改单元格的值。
 private Microsoft.Office.Interop.Excel.Application _xlApplication;

        private Workbook _xlWorkBook;

        private Worksheet _xlWorkSheet;

        private void ExcelDo()
        {
            _xlApplication = new Microsoft.Office.Interop.Excel.Application {
                Visible = true, //Excel应用是否可见
                WindowState = XlWindowState.xlMaximized, //Excel窗口弹出状态
                DisplayAlerts = false //是否允许Excel弹出警告
            }; 
            _xlWorkBook = _xlApplication.Workbooks.Add("xls"); //对应你的Excel模板路径
            _xlWorkSheet = _xlWorkBook.Sheets.get_Item(1); //1, 表示要操作第一个Sheet,Excel所有索引都是从1开始编号的
            _xlWorkSheet.Select();

            _xlWorkSheet.Cells[1, 1].Value = "MyValue"; //设置单元格文字, 或者
            _xlWorkSheet.Range["A1"].Value = "MyValue"; //设置单元格文字

            string myValue1 = _xlWorkSheet.Range["A1"].Text; //获取单元格文字, 或者
            string myValue2 = _xlWorkSheet.Cells[1, 1].Text;//获取单元格文字

            ExitApplication(); //这个是关闭最死的方法,死得透透的,直接_xlApplication.Quit();会有残留进程。
        }

        //先 using System.Runtime.InteropServices;
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);

        //完全退出
        public void ExitApplication()
        {
            _xlApplication.Quit();
            GetWindowThreadProcessId(new IntPtr(_xlApplication.Hwnd), out int k);
            System.Diagnostics.Process.GetProcessById(k).Kill();
        }
如采纳,望给分
塔克茜丝 2020-05-23
  • 打赏
  • 举报
回复
引用 2 楼 weixin_28996651 的回复:
我做了一个用NPOI实现的excel文件读取、生成需要数据、存储数据的小程序,需要的话可以找我~

你好,是否有相关的文档可以分享和参考?谢谢。
加载更多回复(3)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧