Board logo

标题: [问题求助] 【已解决】powershell操作excel保存时出错,求指导 [打印本页]

作者: for_flr    时间: 2022-3-17 16:03     标题: 【已解决】powershell操作excel保存时出错,求指导

本帖最后由 for_flr 于 2022-3-22 14:56 编辑

求助论坛大佬
我通过一些过程得到一组数据 $list :
  1. 姓名 记录时间 年龄 身高 体重 地点 备注
  2. A 3/14 20 160 60 云南 无异常
  3. B 3/17 19 170 50 广西 无异常
  4. C 3/14 35 160 50 广东 无异常
  5. D 3/14 34 160 50 上海 无异常
  6. E 3/17 33 160 70 辽宁 无异常
  7. F 3/17 28 160 90 吉林 无异常
  8. G 3/14 30 160 60 内蒙 无异常
  9. 小张 3/16 15 160 80 新疆 无异常
  10. 老王 3/17 19 160 40 西藏 无异常
  11. 阿妹 3/14 32 180 60 甘肃 无异常
复制代码
想将其写进excel表格里,并加上框线,第一行字体加粗。
  1. $list|out-file ccc.xls
  2. #out-file ccc.xls 可以瞬间将数据写进表格,问题出在后面。
  3. $f=gi ccc.xls
  4. $excel=new-object -com excel.application
  5. $excel.visible=$true
  6. $wk=$excel.workbooks.open($f)
  7. $st=$wk.sheets.item(1)
  8. $st.usedrange.borders.linestyle=1
  9. $st.usedrange.borders.weight=2
  10. $st.range("A1:G1").font.bold=$true
  11. [void]$st.usedrange.entirecolumn.autofit()
  12. $wk.save()
  13. $wk.close()
  14. #这里老是要跳出提示框
  15. #“是否保存对ccc.xls的更改?”
  16. $excel.quit()
  17. $st=$wk=$excel=$r=$c=$null
  18. [gc]::collect()
复制代码


不管点是、否、取消,在打开ccc.xls时候都没有加上框线和黑体...
并且在打开ccc.xls时有这个提示

网上搜索了一两天,没搞定。
if版主二楼提示版本问题,现在可以通过手动打开ccc.xls,另存为一次可解决,但我无法用代码自动化实现

不用out-file生成xls,用workbooks.add()是完全可行的,但是速度巨慢!!不知为何。
  1. $r=$c=1
  2. $excel=new-object -com excel.application
  3. $excel.visible=$true
  4. $wk=$excel.workbooks.add()
  5. $st=$wk.sheets.item(1)
  6. $list|%{
  7.   foreach($i in $_.split()){
  8.     $st.cells.item($r,$c)=$i
  9.     $c++
  10.   }
  11. $r++
  12. $c=1
  13. }
  14. $st.usedrange.borders.linestyle=1
  15. $st.usedrange.borders.weight=2
  16. $st.range("A1:G1").font.bold=$true
  17. [void]$st.usedrange.entirecolumn.autofit()
  18. $wk.saveas("C:\Users\lenovo\Desktop\tmp.xls")
  19. $wk.close()
  20. $excel.quit()
  21. $st=$wk=$excel=$r=$c=$null
  22. [gc]::collect()
复制代码
初学powershell,这两个代码不知道是哪些地方没弄对,希望得到前辈大佬的帮助,谢谢。
作者: 523066680    时间: 2022-3-17 16:16

本帖最后由 523066680 于 2022-3-17 16:17 编辑

虽然我很少用powershell
不过有几点应该可以参考,
1. 应该你系统excel版本大于2003,调用相关API再保存等于保存到较高版本就会弹窗提示。你可以试试先手动把原来的xls文档另存为Excel2007或以上的 xlsx 格式(另存的时候有选项)
2. 完整的方法、属性和参数,参考MSDN文档
https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.saveas
边框:
https://docs.microsoft.com/zh-cn/office/vba/api/excel.borders
3. 新建一个带宏的xlsm表格,开发工具里面录制宏,自己去做一些操作,然后停止录制,编辑宏,参考录制的EXCEL VBA代码
作者: 5i365    时间: 2022-3-17 16:28

回复 1# for_flr


    建议大侠可以用用专门的组件, 下面的链接是国产的办公组件, 有免费版, 完全够用 ps可以直接调用C#代码, 只需要引用一个dll就行了, 好多复杂的情况, 看看帮助示例就解决了

https://www.e-iceblue.cn/worksheet/set-border-style-in-excel.html
作者: for_flr    时间: 2022-3-17 16:40

本帖最后由 for_flr 于 2022-3-18 17:36 编辑

回复 2# 523066680


    哇,if版主好久不见!
我把ccc.xls先手动另存为97~2003版本,ccc.xls
或者默认格式ccc.xlsx
相应改动脚本再运行就不会出现那两个提示框。感谢指点。
具体存啥版本好像是参数支持,我去翻一翻。
作者: for_flr    时间: 2022-3-17 16:50

回复 3# 5i365


    跟office估计大同小异,主要还是我自己经验不足,遇到问题晕头转向,难以排错。。。
作者: WHY    时间: 2022-3-20 22:12

out-file 保存的是纯文本格式文件,Excel 不会因为改后缀成 xls,就就认定它一定是 XLS。
果真如此,巨硬的那些开发Excel的工程师要哭晕。
可以保存格式为 txt 或 csv,然后调用SaveAs方法。
  1. $List = '姓名 记录时间 年龄 身高 体重 地点 备注
  2. A 3/14 20 160 60 云南 无异常
  3. B 3/17 19 170 50 广西 无异常
  4. C 3/14 35 160 50 广东 无异常
  5. D 3/14 34 160 50 上海 无异常
  6. E 3/17 33 160 70 辽宁 无异常
  7. F 3/17 28 160 90 吉林 无异常
  8. G 3/14 30 160 60 内蒙 无异常
  9. 小张 3/16 15 160 80 新疆 无异常
  10. 老王 3/17 19 160 40 西藏 无异常
  11. 阿妹 3/14 32 180 60 甘肃 无异常';
  12. Out-File E:\1.txt -Input $List;
  13. $excel = New-Object -ComObject Excel.Application;
  14. $excel.Visible = $True;
  15. $work  = $excel.Workbooks.Open('E:\1.txt');
  16. $sheet = $work.WorkSheets.Item(1);
  17. $sheet.UsedRange.Borders.LineStyle = 1;
  18. $sheet.UsedRange.Borders.Weight = 2;
  19. $sheet.Rows.Item(1).Font.Bold = $True;
  20. [void]$sheet.UsedRange.EntireColumn.AutoFit();
  21. $work.SaveAs('E:\1.xls', 56);
  22. $work.Close();
  23. #$excel.Quit();
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2