文章中写了点过程有点啰嗦,想直接看代码的直接下拉看加粗标题处

第一次使用COM组件操作excel,遇到了点坑,也有些感触。
一般来说操作excel,我比较常用的是OleDB,但是OleDB需要安装AccessDatabaseEngine,现在的公司没有特殊情况又不允许随便装东西,所以在出现了“未在本地计算机上注册“microsoft.ACE.oledb.12.0”错误之后无奈放弃,然后又试了Spire,奈何Spire需要收费,在保存excel之后,会出现一个删除不掉的sheet,最后决定使用COM组件进行操作。
先放一个Spire获取excel值的代码(这个可以正常使用,不收费):

Spire读取excel数据代码:

  • 添加引用:

在项目的引用上右击,选择管理NuGet程序包,搜FreeSpire进行安装

  • 代码示例:
/// <summary>
/// 获取并生成Excel
/// </summary>
/// <param name="path"></param>
private void getExcel(string path)
{Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();workbook.LoadFromFile(path);//获取第一张工作表Spire.Xls.Worksheet sheet = workbook.Worksheets[0];//保存为csv格式sheet.SaveToFile("Customer.csv", ",", Encoding.UTF8);List<string[]> list = new List<string[]>();StreamReader fileReader = new StreamReader("Customer.csv");string strLine = "";while (strLine != null){strLine = fileReader.ReadLine();if (strLine != null && strLine.Length > 0){list.Add(strLine.Split(','));}}fileReader.Close();list.Remove(list[0]);//item便是为行foreach (var item in list){//取出来的值(item[0])前后会有"\",试了别的方法没啥用,只能用最笨的截取字符串的方法string value1 = cutOut(item[0]);string value2 = cutOut(item[1]);}this.Close();
}/// <summary>
/// 截取字符串
/// </summary>
/// <param name="value">需要截取的字符串</param>
/// <returns></returns>
public string cutOut(string value)
{string subValue = "";subValue = value.Substring(0, value.Length - 1);subValue = subValue.Substring(1, subValue.Length - 1);return subValue;
}

如果有可以优化的地方,看到的大佬可以评论区指点一下共同进步,谢谢!

言归正传,回到COM组件,需求经历过一次变更,而卡住的地方在第二次修改的时候。

  • 第一次,从一个配置excel(PTIT.xlsx)中获取需要写入的值,然后把这值填入模板excel,最后保存为xlsx格式的excel。
    操作如下:

保存为xlsx格式的代码示例:

  • 添加引用:
    在项目的引用上右击,选择管理NuGet程序包,搜FreeSpire进行安装
  • 增加命名空间引用:
    using Excel = Microsoft.Office.Interop.Excel;
  • 获取excel数据代码:
/// <summary>
/// 获取Excel
/// </summary>
/// <param name="path"></param>
private void GetExcel(string path)
{Excel.Workbooks workbooks = app.Workbooks;Excel._Workbook workbook = workbooks.Add(AppDomain.CurrentDomain.BaseDirectory + @"\PTIT.xlsx"); //加载模板Excel.Sheets sheets = workbook.Sheets;Excel._Worksheet worksheet = (Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。for (int i = 1; i <= worksheet.UsedRange.Rows.Count; i++){if (i != 1){//获取第一个sheet中的值string value1 = worksheet.Cells[i, 1].Value;string value2 = worksheet.Cells[i, 2].Value;}}
}
  • 操作并保存excel:
/// <summary>
/// 填写excel并保存
/// </summary>
/// <param name="value1">第一个值</param>
/// <param name="value2">第二个值</param>
private void Export(string value1, string value2)
{Excel.Workbooks workbooks = app.Workbooks;//Directory.GetCurrentDirectory() 用于获取当前项目所在的路径一般为...\bin\DebugExcel._Workbook workbook = workbook = workbooks.Add(Directory.GetCurrentDirectory() + @"\需要修改的excel.xlsx"); //加载模板Excel.Sheets sheets = workbook.Sheets;Excel._Worksheet worksheet = (Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。if (worksheet == null)return;//下标从1开始//给第五行,第三列赋值worksheet.Cells[5, 3] = value1;//给第六行,第四列赋值worksheet.Cells[6, 4] = value2;//不需要弹出消息框app.AlertBeforeOverwriting = false;//保存到D盘下string savaPath =   @"D:\修改完的excel.xlsx";workbook.SaveAs(savaPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);workbook.Close(SaveChanges: true);
}

第二次需求变为保存为.xlsm格式.然后就发现上面的方法没有办法直接用,用上面的SaveAs保存报错。报错信息为:

[这个扩展名不能用于所选择的文件格式。请在[文件名]框中更改文件扩展名,或在[文件种类]框中选择其他文件格式]

COM组件里保存方法有:
1)workbook.Save()
2)workbook.SaveAs()
3)workbook.SaveCopyAs()

workbook.Save()无法指定路径,所以首先排除。

workbook.SaveAs()按道理来说应该可以保存xlsm,所以在查了资料后更改了其中的参数:
workbook.SaveAs(savaPath, XlFileFormat.xlXMLSpreadsheet,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
XlSaveConflictResolution.xlLocalSessionChanges, Missing.Value,
Missing.Value, Missing.Value, Missing.Value);

保存成功,但是保存下来的excel双击打开提示:

[文件不能打开,格式或者扩展名格式不正确]

点击消息框的OK之后,整个excel变成空白并且损坏。(如果有大神看到知道原因,希望可以指点一下)

各种查询无果后,尝试了最后一个保存方法 workbook.SaveCopyAs():
结果是成功保存下来,而且excel可以用,但是很尴尬的是,每次都会弹出来一个另存为选择路径的窗口,那么问题就还是没有解决。最终死马当活马医,更改了代码:

Excel._Workbook workbook = workbooks.Add(AppDomain.CurrentDomain.BaseDirectory + @"\PTIT.xlsx"); //加载模板

改为

Excel._Workbook workbook = workbooks.Open(AppDomain.CurrentDomain.BaseDirectory + @"\PTIT.xlsx"); //加载模板

才最终成功。

保存为.xlsm格式excel的代码示例:

  • 添加引用:
    在项目的引用上右击,选择管理NuGet程序包,搜FreeSpire进行安装
  • 增加命名空间引用:
    using Excel = Microsoft.Office.Interop.Excel;
  • 获取Excel数据(与上面的获取代码一致)
/// <summary>
/// 获取Excel
/// </summary>
/// <param name="path"></param>
private void GetExcel(string path)
{Excel.Workbooks workbooks = app.Workbooks;Excel._Workbook workbook = workbooks.Add(AppDomain.CurrentDomain.BaseDirectory + @"\PTIT.xlsx"); //加载模板Excel.Sheets sheets = workbook.Sheets;Excel._Worksheet worksheet = (Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。for (int i = 1; i <= worksheet.UsedRange.Rows.Count; i++){if (i != 1){//获取第一个sheet中的值string value1 = worksheet.Cells[i, 1].Value;string value2 = worksheet.Cells[i, 2].Value;}}
}
  • 操作并保存excel:
/// <summary>
/// 填写excel并保存
/// </summary>
/// <param name="value1">第一个值</param>
/// <param name="value2">第二个值</param>
private void Export(string value1, string value2)
{Excel.Workbooks workbooks = app.Workbooks;//Directory.GetCurrentDirectory() 用于获取当前项目所在的路径一般为...\bin\DebugExcel._Workbook workbook = workbook = workbooks.Open(Directory.GetCurrentDirectory() + @"\需要修改的excel.xlsm"); //加载模板Excel.Sheets sheets = workbook.Sheets;Excel._Worksheet worksheet = (Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。if (worksheet == null)return;//下标从1开始//给第五行,第三列赋值worksheet.Cells[5, 3] = value1;//给第六行,第四列赋值worksheet.Cells[6, 4] = value2;//不需要弹出消息框app.AlertBeforeOverwriting = false;//保存到D盘下string savaPath = @"D:\修改完的excel.xlsm";workbook.SaveCopyAs(savaPath);workbook.Close(SaveChanges: true);
}

创建\删除文件夹,附代码:

//判断D盘下是否存在other文件夹
if (!Directory.Exists(@"D:\other"))
{//如果不存在就创建Directory.CreateDirectory(@"D:\other");
}
//删除D盘下的other文件夹
Directory.Delete(@"D:\other", true);

excel中各个方法的作用参考文献:
C#操作Excel方法总结

本文中的一些问题,以及如果有什么错误或者可以优化的地方,欢迎看到的大神评论留言指出,谢谢。

C#日常开发随手记------COM组件(Microsoft.Office.Interop.Excel)操作excel、如何创建\删除文件夹相关推荐

  1. C#,使用office组件Microsoft.Office.Interop.Word 保存word文档为图片

    网上查了很多的攻略教程,汇总如下,亲测 using System; using System.Collections.Generic; using System.IO; using System.Te ...

  2. C# Microsoft.Office.Interop.Owc11 导出excel文件

    C# Microsoft.Office.Interop.Owc11 导出excel文件 1.新建项SupremeWindowsForms窗体应用项目(项目平台设置称X86) 注意:因为大多数第三方写的 ...

  3. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,向表格插入图片

    上篇:[C#]C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本 Word模板: 代码: try {Application app = new Applica ...

  4. C#,使用office组件Microsoft.Office.Interop.Word,将网页内容下载为word的demo及权限配置要点。

    在做网页开发的时候,经常会遇到下载需求,以下这种方式是保存为原生的word格式.非直接将HTML另存为. 1. 首先是下载为word 的代码. 引用: using MSWord = Microsoft ...

  5. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本

    最近要做一个批量打印文档功能,于是找了Microsoft.Office.Interop.Word这个插件. 基本步骤是这样的,创建Word模板文档,C#调用模板文档替换对应的文本,保存新文档. 下面仅 ...

  6. 使用Microsoft.Office.Interop.PowerPoin遥控PPT

    Microsoft.Office.Interop.PowerPoin操作PPT 主窗体,填写ppt路径,打开ppt 打开ppt后,可用代码操作ppt 可获取每页PPT截图,并获取对应小节名称,备注等 ...

  7. window2008 64位系统无法调用Microsoft.Office.Interop组件进行文件另存的解决办法

    服务器是windows server2008 64位系统,项目中需要用到Microsoft.Office.Interop组件,包括excel.word.ppt等. 步骤  1.在"开始&qu ...

  8. C#实战005:Excel操作-引入Microsoft.Office.Interop.Excel组件

    能读到Excel工作簿,现在我们接着再来创建工作簿,OleDb通过Microsoft Jet 提供程序连接到 Excel 工作簿,然后将Excel文件作为数据源来读写,直接用Sql语句来操作数据,并且 ...

  9. 未能找到引用的组件“Microsoft.Office.Core”

    1. 删除原来对Excel的引用,从Web.config中     2. 在visual Studio 2005命令提示工具中,定位到Excel安装目录,运行"TlbImp EXCEL.EX ...

最新文章

  1. feignclient多个配置_@FeignClient同一个name使用多个配置类的解决方案
  2. html判断是否有某个元素,jquery怎么判断元素是否存在?
  3. C语言再学习 -- Ubuntu 12.04 root用户登录设置
  4. Android dex分包方案 (多dex)
  5. 仙逆网页服务器失败,全民仙逆闪退进不去了怎么办 闪退解决办法汇总
  6. 【linux命令】Centos下如何匹配内容在哪个文件中
  7. getchwd() 函数返回当前工作目录。
  8. oracle重新生成控制文件,Oracle重建控制文件的语法
  9. SpringBoot2.1.5(34)--- SpringBoot 实例
  10. 结构体指针memcpy出错_关于memset和memcpy的使用,尤其对结构体进行初始化和拷贝的问题 | 学步园...
  11. Siri在苹果继续活着、蠢着、没落着,现在它最后一个创始人也走了
  12. Java程序员必须掌握的Spring依赖管理原理
  13. ubuntu14.04 LTS Visual Studio Code 编辑器推荐
  14. Selenium-IDE脚本录制,selenium-side-runner自动化测试教程
  15. FreeSwitch +fusionpbx安装和基本使用
  16. 315|大数据杀熟,如何才不被坑?
  17. 手把手教你申请计算机软件著作权(4)——资料邮寄
  18. c语言程序后退_单片机控制小车循迹(前进、后退、左右转)
  19. STM32 环境光传感器ADC采样
  20. python pandas修改列名,Python_Pandas学习笔记02:DataFrame获取列名和修改列名

热门文章

  1. 基于热敏电阻的数字温度计
  2. python3时间格式化
  3. 为什么要做数据可视化?可以这样回答
  4. 并行计算 python_一分钟了解 Python 中的并行计算
  5. 考研复试计算机组成原理面试题(三)—指令系统
  6. react或vue启动命令那些事
  7. 旅行商问题(华为笔试蜜蜂采蜜问题)
  8. 游侠一直显示连接服务器,在游侠平台自己开的服务器 朋友第二次以后就无法进入...
  9. 让美颜app瞬间弱爆的AI算法 附教程
  10. 搬运工——ubuntu(1)