批处理之家's Archiver

for_flr 发表于 2022-3-17 16:03

【已解决】powershell操作excel保存时出错,求指导

[i=s] 本帖最后由 for_flr 于 2022-3-22 14:56 编辑 [/i]

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

不管点是、否、取消,在打开ccc.xls时候都没有加上框线和黑体...
并且在打开ccc.xls时有这个提示
[img]https://s3.bmp.ovh/imgs/2022/03/36f516a465d5b5a0.jpg[/img]
网上搜索了一两天,没搞定。
if版主二楼提示版本问题,现在可以通过手动打开ccc.xls,另存为一次可解决,但我无法用代码[color=Red]自动化实现[/color]。

不用out-file生成xls,用workbooks.add()是完全可行的,但是[color=Red]速度巨慢[/color]!!不知为何。[code]$r=$c=1
$excel=new-object -com excel.application
$excel.visible=$true
$wk=$excel.workbooks.add()
$st=$wk.sheets.item(1)
$list|%{
  foreach($i in $_.split()){
    $st.cells.item($r,$c)=$i
    $c++
  }
$r++
$c=1
}
$st.usedrange.borders.linestyle=1
$st.usedrange.borders.weight=2
$st.range("A1:G1").font.bold=$true
[void]$st.usedrange.entirecolumn.autofit()
$wk.saveas("C:\Users\lenovo\Desktop\tmp.xls")
$wk.close()
$excel.quit()
$st=$wk=$excel=$r=$c=$null
[gc]::collect()[/code]初学powershell,这两个代码不知道是哪些地方没弄对,希望得到前辈大佬的帮助,谢谢。

523066680 发表于 2022-3-17 16:16

[i=s] 本帖最后由 523066680 于 2022-3-17 16:17 编辑 [/i]

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

5i365 发表于 2022-3-17 16:28

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=252819&ptid=61968]1#[/url] [i]for_flr[/i] [/b]


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

[url]https://www.e-iceblue.cn/worksheet/set-border-style-in-excel.html[/url]

for_flr 发表于 2022-3-17 16:40

[i=s] 本帖最后由 for_flr 于 2022-3-18 17:36 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=252822&ptid=61968]2#[/url] [i]523066680[/i] [/b]


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

for_flr 发表于 2022-3-17 16:50

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=252824&ptid=61968]3#[/url] [i]5i365[/i] [/b]


    跟office估计大同小异,主要还是我自己经验不足,遇到问题晕头转向,难以排错。。。

WHY 发表于 2022-3-20 22:12

out-file 保存的是纯文本格式文件,Excel 不会因为改后缀成 xls,就就认定它一定是 XLS。
果真如此,巨硬的那些开发Excel的工程师要哭晕。
可以保存格式为 txt 或 csv,然后调用SaveAs方法。[code]$List = '姓名        记录时间        年龄        身高        体重        地点        备注
A        3/14        20        160        60        云南        无异常
B        3/17        19        170        50        广西        无异常
C        3/14        35        160        50        广东        无异常
D        3/14        34        160        50        上海        无异常
E        3/17        33        160        70        辽宁        无异常
F        3/17        28        160        90        吉林        无异常
G        3/14        30        160        60        内蒙        无异常
小张        3/16        15        160        80        新疆        无异常
老王        3/17        19        160        40        西藏        无异常
阿妹        3/14        32        180        60        甘肃        无异常';

Out-File E:\1.txt -Input $List;

$excel = New-Object -ComObject Excel.Application;
$excel.Visible = $True;
$work  = $excel.Workbooks.Open('E:\1.txt');
$sheet = $work.WorkSheets.Item(1);
$sheet.UsedRange.Borders.LineStyle = 1;
$sheet.UsedRange.Borders.Weight = 2;
$sheet.Rows.Item(1).Font.Bold = $True;
[void]$sheet.UsedRange.EntireColumn.AutoFit();
$work.SaveAs('E:\1.xls', 56);
$work.Close();
#$excel.Quit();[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.