找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18392|回复: 5

[问题求助] 【已解决】powershell操作excel保存时出错,求指导

[复制链接]
发表于 2022-3-17 16:03:27 | 显示全部楼层 |阅读模式
本帖最后由 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,这两个代码不知道是哪些地方没弄对,希望得到前辈大佬的帮助,谢谢。
发表于 2022-3-17 16:16:09 | 显示全部楼层
本帖最后由 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代码
发表于 2022-3-17 16:28:32 | 显示全部楼层
回复 1# for_flr


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

https://www.e-iceblue.cn/worksheet/set-border-style-in-excel.html
 楼主| 发表于 2022-3-17 16:40:10 | 显示全部楼层
本帖最后由 for_flr 于 2022-3-18 17:36 编辑

回复 2# 523066680


    哇,if版主好久不见!
我把ccc.xls先手动另存为97~2003版本,ccc.xls
或者默认格式ccc.xlsx
相应改动脚本再运行就不会出现那两个提示框。感谢指点。
具体存啥版本好像是参数支持,我去翻一翻。
 楼主| 发表于 2022-3-17 16:50:09 | 显示全部楼层
回复 3# 5i365


    跟office估计大同小异,主要还是我自己经验不足,遇到问题晕头转向,难以排错。。。
发表于 2022-3-20 22:12:21 | 显示全部楼层
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();
复制代码

评分

参与人数 1技术 +1 收起 理由
for_flr + 1 感觉是saveas方法中fileformat的功劳

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:25 , Processed in 0.024658 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表