找回密码
 加入
搜索
查看: 6336|回复: 16

[网络通信] 已解决 求助! EXCEL怎么读取 写入值错误

[复制链接]
发表于 2020-9-18 01:08:33 | 显示全部楼层 |阅读模式
本帖最后由 itzyx 于 2020-9-19 21:12 编辑
#include<Excel.au3>

$oExcel=ObjCreate("Excel.Application")    ; 创建excel应用程序对象
$path=@DesktopDir&"\新建 XLS 工作表.xls" ;设置路径

$owork=_Excel_BookOpen($oExcel,$path)     ;打开一个工作表
Local $FileNew = StringFormat('%04s%02s%02s_%02d%02d%02d.xls', @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC)  ;以当前时间给工作表命名
$owork.saveas(@DesktopDir&""&$FileNew)   ;另存

$owork.Worksheets("Sheet1").Activate      ;激活Sheet1
$xls_sup=$owork.WorkSheets(1)             ;第一个工作表,即Sheet1 
$sresult=_Excel_RangeRead($owork,"Sheet1","A1:A8",3)   ;读取Sheet1 里面A1-A8的内容,3-显示的文本
$cresult=StringRight($sresult,7)    ; 通过辅助工具读取图片的时间戳 到EXCEL表格里,单位为us,截取从右边开始第七个字符串
$zresult=StringRegExpReplace($cresult, '[^\d]', '')  ;利用正则替换小数点
_Excel_RangeWrite($owork,"Sheet1","$cresult","B1:B8",True) ;写入到B1:B8里面 


这个是我的代码,_Excel_RangeWrite  那一步写入错误!!
我是通过辅助工具,提取拍摄图片的时间戳 到EXCEL表格里,单位精确到us, 但是时间戳每次都不一样,平时我都要移动小数点,使单位统一到秒方便计算,那样太麻烦, 现在想通过AU3解决这个问题,我想法是读取到Sheet1 里面A1-A8的内容,然后从右截取7个字符串,比如:1000.257.333
截取后就是.257.333  然后通过正则替换小数点(才知道正则这个名词,看了A大的例子,照葫芦画瓢用了一下)  这样想着格式统一可以算出差值,  但无奈我有心学习,终究时间短,懂的少,没能实现,好多问题 ,只能求教各位大佬了;万分感谢!
下面是我的理想结果图


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2020-9-18 02:09:09 | 显示全部楼层
我擦勒,上高中都没这么认真,一下干到两点了 ,睡了睡了 ,期待明天早上有大佬解答一下
发表于 2020-9-19 12:10:37 | 显示全部楼层
EXCEL 本身的公式就能完成你的需求,单元格字符截取 单元格字符转数字。最后做运算就能出结果。
发表于 2020-9-19 16:12:47 | 显示全部楼层
部分代码,完成到表格B列,剩余C列的功能自己参考帮助文档吧,自己捣鼓的东西才印象深刻……
#include<Excel.au3>
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oExcel, @DesktopDir&"\新建 Microsoft Excel 工作表.xls");自己的桌面文档名称,自行更改
Local $aResult = _Excel_RangeRead($oWorkbook, "Sheet1","A1:A8")   ;读取Sheet1 里面A1-A8的内容

$sresult =_ArrayToString($aResult,@CR)
$zresult=StringRegExpReplace($sresult, '(\d+)\.(\d{3})\.(\d{3})', '$1.$2$3') ;利用正则替换小数点
$aResult2=StringSplit($zresult, @CR,2);2, 关闭第一个元素中的返回数量 

_Excel_RangeWrite($oWorkbook,"Sheet1",$aResult2,"B1:B8",True) ;写入到B1:B8里面 
Local $FileNew = StringFormat('%04s%02s%02s_%02d%02d%02d.xls', @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC)  ;以当前时间给工作表命名
_Excel_BookSaveAs($oWorkbook, @DesktopDir & "" &$FileNew , Default, True)
发表于 2020-9-19 16:53:46 | 显示全部楼层
<p>
</p><p>func g_ex2($ex_p,$zt)
        if FileExists($ex_p) then
        $xls = ObjGet($ex_p)
        With $xls.activesheet
                        $xls_su = .usedrange.value
                        $xls_su = .parent.application.transpose($xls_su)
                        .parent.close(False)
        EndWith
        ;_ArrayDisplay($xls_su)
Return $xls_su
EndIf
EndFunc</p>
Func zj_put($azz)
Local $oWorkbook = _Excel_Open()
        Global        $xls =_Excel_BookNew($oWorkbook,1)
        WinActivate($oWorkbook)
        $xls.Sheets("Sheet1").Name ="表一"
        ;$xls.Sheets("Sheet1").Name= "排产"
        ClipPut('');;;;清空剪贴板:预备动作
        _ArrayToClip2D($azz, 2, 1);;;把数组写入剪贴板(开始行0,开始列1):仅支持二维数组。原数组仅支持一维数组
        $text = ClipGet();;;;获取剪贴板文本数据
        $xls.activesheet.range("A1").Select;;;选择A1单元格:下句将从A1单元格开始复制
        $xls.activesheet.range("A1").PasteSpecial;

With $xls.activesheet
        ;.Columns(1).NumberFormatLocal = "0"
EndWith
EndFunc

;---------------------------------------------------输出EXCEL
;Global $xls
;Local $ay[10]
;$ay[0]=3
;$ay[1] = 16
;$ay[2] = 50
;$ay[3] = 7.5
;Local $oWorkbook = _Excel_Open()
;$xls =_Excel_BookNew($oWorkbook,1)
;WinActivate($oWorkbook)
;$xls.Sheets("Sheet1").Name = "物料统计"
;put3($qq2, $ay, "d" & UBound($qq2), 1, 1)
;_Excel_SheetAdd($xls, 1, True, 1, "BOM明细")
;put3($arr_su, $ay, "f" & UBound($arr_su), 1, 1)



Func put3($gl, $lie, $kuan, $len1, $len2) ;数组,列宽,表宽"m" & $sj,筛选1,自动换行2

        ClipPut('') ;;;;清空剪贴板:预备动作
        _ArrayToClip2D($gl, 1, 1) ;;;把数组写入剪贴板(开始行0,开始列1):仅支持二维数组。原数组仅支持一维数组
        $text = ClipGet() ;;;;获取剪贴板文本数据
        ;$xls.Sheets("Sheet1").Name= $name
        $xls.activesheet.range("A1").Select ;;;选择A1单元格:下句将从A1单元格开始复制
        $xls.activesheet.range("A1").PasteSpecial ;;;复制剪贴板文本数据
        If $len1 = 1 Then Send("^+{l}")

        ;($lie)
        With $xls.activesheet
                For $i = 1 To $lie[0]
                        .Columns($i).ColumnWidth = $lie[$i]
                Next
                ;.Columns(5).ColumnWidth =0
                ;.Columns(12).ColumnWidth =0
                .Columns(1).NumberFormatLocal = "0"
                .Columns(8).NumberFormatLocal = "0"
                .Columns(7).font.size = 9 ;设置字体大小
                .Columns(7).font.name = "楷体" ;设置字体名称
                .Columns(14).font.size = 9 ;设置字体大小
                .Columns(14).font.name = "楷体" ;设置字体名称
                ;                .rows($sj).font.size = 9;最后行
                .Columns(6).font.size = 9 ;设置字体大小
                .Columns(6).font.size = 9 ;设置字体大小
                .Columns(13).font.size = 9 ;设置字体大小
                .Columns(13).font.size = 9 ;设置字体大小

        EndWith
        #cs
                With $xls.ActiveSheet.PageSetup ;设置打印页面设置的属性
                ;    .cells(1,5).NumberFormatLocal ="0"
                .LeftMargin = $xls.InchesToPoints(0.3) ;以磅为单位返回或设置左边距的大小置左边距
                .RightMargin = $xls.InchesToPoints(0) ;以磅为单位返回或设置右边距的大小置左边距
                .TopMargin = $xls.InchesToPoints(0) ;以磅为单位返回或设置上边距的大小置左边距
                .BottomMargin = $xls.InchesToPoints(0) ;以磅为单位返回或设置下边距的大小置左边距
                .HeaderMargin = $xls.InchesToPoints(0) ;以磅为单位返回或设置页面顶端到页眉的距离
                .FooterMargin = $xls.InchesToPoints(0) ;以磅为单位返回或设置页面底端到页脚的距离
                .PrintHeadings = False ;如果打印本页时同时打印行标题和列标题,则该值为 True。仅应用于工作表。
                ;.PrintGridlines = False     ;如果在页面上打印单元格网格线,则该值为 True。仅应用于工作表。
                ;        .PrintQuality = 300         ;返回或设置打印质量。
                .CenterHorizontally = True ;如果在页面的水平居中位置打印指定工作表,则该属性值为 True。
                .CenterVertically = True ;如果在页面的垂直居中位置打印指定工作表,则该属性值为 True。
                ;.Draft = False              ;如果打印工作表时不打印其中的图形,则该属性值为 True。
                .BlackAndWhite = True ;如果指定文档中的元素以黑白方式打印,则该属性值为 True。
                EndWith
        #ce
        Local $az = "A1:" & $kuan
        ;$xls.range("a3:a4").mergecells=true
        ;$xls.range($az).mergecells=true
        ;$xls.range("a2:ai2").mergecells=true合并单元格
        With $xls.ActiveSheet.Range($az)
                .Borders($xlEdgeTop).LineStyle = $xlContinuous ;上边线
                .Borders($xlEdgeTop).ColorIndex = 0 ;上边线颜色
                .Borders($xlEdgeBottom).LineStyle = $xlContinuous ;下边线
                .Borders($xlEdgeBottom).ColorIndex = 0 ;下边线颜色
                .Borders($xlEdgeLeft).LineStyle = $xlContinuous ;左边线
                .Borders($xlEdgeLeft).ColorIndex = 0 ;左边线颜色
                .Borders($xlEdgeRight).LineStyle = $xlContinuous ;右边线
                .Borders($xlEdgeRight).ColorIndex = 0 ;右边线颜色
                .Borders($xlInsideHorizontal).LineStyle = $xlContinuous ;内横线
                .Borders($xlInsideHorizontal).ColorIndex = 0 ;内横线颜色
                .Borders($xlInsideVertical).LineStyle = $xlContinuous ;内竖线
                .Borders($xlInsideVertical).ColorIndex = 0 ;内竖线颜色
                If $len2 = 2 Then .Range($az).WrapText = True
        EndWith
EndFunc   ;==>put
读取表格去数组,想咋折腾咋折腾,然后再输出表格,简单快捷


 楼主| 发表于 2020-9-19 18:29:23 | 显示全部楼层
floor6ggg 发表于 2020-9-19 16:12
部分代码,完成到表格B列,剩余C列的功能自己参考帮助文档吧,自己捣鼓的东西才印象深刻……

好的 ,万分感谢 !
 楼主| 发表于 2020-9-19 18:30:08 | 显示全部楼层
duxing 发表于 2020-9-19 16:53
读取表格去数组,想咋折腾咋折腾,然后再输出表格,简单快捷

实在感谢 ,可以好好捣鼓一下
 楼主| 发表于 2020-9-19 18:36:02 | 显示全部楼层
afan 发表于 2020-9-19 10:31
语法都不对,看看帮助文档吧

好的,我当时就是一步步 看帮助文档来的,基础比较差,捣鼓到凌晨  居然没看出语法错误,看来 AU3这条路
路漫其修远兮啊
发表于 2020-9-19 18:42:22 | 显示全部楼层
itzyx 发表于 2020-9-19 18:36
好的,我当时就是一步步 看帮助文档来的,基础比较差,捣鼓到凌晨  居然没看出语法错误,看来 AU3这条路  ...

我没装这些办公软件,不知道你的操作目的,所以我只粗略看了下,语法是肯定有问题的
第12行 _Excel_RangeRead($owork,"Sheet1","A1:A8",3)   ;3显示文本,用这个参数就不支持多个单元格
第15行 变量名 $cresult 不能用引号包围,否则它就代表一个内容为 "$cresult" 这几个字符的字符串了,这是Au3最基础的语法错误。
 楼主| 发表于 2020-9-19 18:54:47 | 显示全部楼层
afan 发表于 2020-9-19 18:42
我没装这些办公软件,不知道你的操作目的,所以我只粗略看了下,语法是肯定有问题的
第12行 _Excel_Rang ...

12行,我看帮助文档1,2,3  试的, 我看数值和公式好像没用,就理解为3 文本了,
15行, 确实是我疏忽大意了,低级错误
不过这次在A大面前出个丑,希望以后能督促自己少犯这种低级错误,把基础练习扎实吧。 插个题外话,为啥我昨天一直登不上网站,一开始提示拒绝访问, 然后就是显示管理员关闭网站了

发表于 2020-9-19 18:59:58 | 显示全部楼层
itzyx 发表于 2020-9-19 18:54
12行,我看帮助文档1,2,3  试的, 我看数值和公式好像没用,就理解为3 文本了,
15行, 确实是我疏忽 ...

昨天是打不开,不过我也不清楚。你需要问网站管理员~
 楼主| 发表于 2020-9-19 21:13:03 | 显示全部楼层
gyp2000 发表于 2020-9-19 12:10
EXCEL 本身的公式就能完成你的需求,单元格字符截取 单元格字符转数字。最后做运算就能出结果。

好的,谢谢指点
 楼主| 发表于 2020-9-19 21:21:01 | 显示全部楼层
duxing 发表于 2020-9-19 16:53
读取表格去数组,想咋折腾咋折腾,然后再输出表格,简单快捷

大神,顺便问一下,同样的代码,在家里的电脑可以打开EXCEL, 在公司电脑打不开是怎么回事, 排除代码错误的情况,还有其他原因嘛  
 楼主| 发表于 2020-9-19 22:56:38 | 显示全部楼层
floor6ggg 发表于 2020-9-19 16:12
部分代码,完成到表格B列,剩余C列的功能自己参考帮助文档吧,自己捣鼓的东西才印象深刻……

大佬您的方法没有问题, 但是我有个疑惑,想请教您,希望能够帮忙解答一下,感谢。
关于 $sresult =_ArrayToString($aResult,@CR) 这个函数;  首先 $aResult 指定从单元格返回的内容,
设值的是默认值,读取的是1- 值 ,_ArrayToString 函数表示:输出一维或二维数组内容到字符串中, 每个元素由指定的分隔符分隔,但是$aResult  可以作为数组用嘛? 为什么我用 msgboxMsgBox($MB_SYSTEMMODAL, "", _ArrayToString($aResult,@CR)得到的 值是-1 呢


发表于 2020-9-19 23:47:36 | 显示全部楼层
手机打字,没调试,
$aResult…返回的是单元格内容的数组,
_ArrayToString($aResult,@CR)……返回文本字符

msgboxMsgBox($MB_SYSTEMMODAL, "", _ArrayToString($aResult,@CR)

这样写的话,最右边是不是少了个右括号…………手机没调试………试试看
MsgBox($MB_SYSTEMMODAL, "", _ArrayToString($aResult,@CR))
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 07:11 , Processed in 0.080090 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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