标题: [文件操作] [已解决]BAT或VBS如何将Excel第2列第2行开始的所有数据,读取写入文本文件 [打印本页]
作者: thp2008 时间: 2023-9-14 15:01 标题: [已解决]BAT或VBS如何将Excel第2列第2行开始的所有数据,读取写入文本文件
本帖最后由 thp2008 于 2023-9-14 16:23 编辑
1、Excel 版本 2021 + Windows 10
2、 文件名及路径:D:\Birds\DaoChu\鸟种数据导出.xlsx 脚本也放在这个目录,这个目录固定,所有操作都是在当前目录。
3、 此Excel 只有一个表,表名: 鸟种数据导出
4、此表,有8列,A\B\C\D\E\F\G\H 我想要第二列的数据,也就是B列,从第2行开始,第一行不要,是标题。
5、我要将读取的第2列,第2行开始的,所有数据,读出来来,写入到一个文本文件 BirdName01.txt。就可以了。
6、数据类型:第2列,第2行开始的所有数据为中文字符,是鸟类的名称。
我搜到论坛里,有可以使用VBS读取Excel的情况,如果手工导出会麻烦一些,因为我会经常要读取这种数据。所以最好能帮我做成这种直接读取EXCEL表的方式。
总结: 我想将D:\Birds\DaoChu\鸟种数据导出.xlsx 的唯一表名“鸟种数据导出” 共8列,我想将第2列,第2行开始的所有数据,导出保存到BirdName01.txt文件中。
感谢!
找到另外一贴子里的VBS脚本,作用不同,能不能直接改一下。http://www.bathome.net/viewthrea ... t=%B6%C1%C8%A1EXCEL- Set fso = CreateObject("Scripting.FileSystemObject")
- fd = fso.GetFolder(".").Path
- Set objExcel = CreateObject("Excel.Application")
- Set objBook = objExcel.Workbooks.open(fd&"\测试.xls")
- objBook.worksheets(1).activate '设置第1个工作表为活动工作表
- Set objSheet = objBook.activeSheet
- For i=5 To 65535 '从第5行开始遍历
- If objSheet.Cells(i, 5).value = "" Then Exit For
- En = objSheet.Cells(i, 5).value 'E列
- Hn = objSheet.Cells(i, 8).value 'H列
- msgbox En &".pdf --> "& Trim(Hn)
- 'If not fso.folderExists(Hn) Then fso.CreateFolder Trim(Hn)
- 'If fso.fileExists(En&".pdf") Then CreateObject("Wscript.Shell").run "cmd /c move """&En&".pdf"" """&Trim(Hn)&"\""",0
- Next
- objBook.Close
- objExcel.Quit
复制代码
作者: thp2008 时间: 2023-9-14 16:22
刚刚突然想起ChatGPT会写代码,于是我将问题扔给了它。几秒钟就根据我的条件写出了代码,我运行后,报了一个错误,我将错误代码发给了它,很快,它又帮我修正了一下,运行后,部分成功了,但还是出错了,后来我分析了一下出错的地方,可能是由于文字中有极生僻的汉字导致的错误,于是,我将这个原因告诉了它,它又采用了一种新的方式生成了代码,但还是部分出错,最后,我再告诉它错误,最终,它生成了最终的版本,完全没有报错,成功了。哇,AI真好,第一次体验。
作者: thp2008 时间: 2023-9-14 16:23
附上,它最终帮我生成的,成功代码,并且还帮我写了注释:- Option Explicit
-
- Dim objExcel, objWorkbook, objWorksheet
- Dim strFilePath, strSheetName, strOutputFile
- Dim intRow, intLastRow, intColumn
- Dim objFSO, objStream
-
- ' 设置 Excel 文件路径、表名和输出文件路径
- strFilePath = "D:\Birds\DaoChu\鸟种数据导出.xlsx"
- strSheetName = "鸟种数据导出"
- strOutputFile = "BirdName01.txt"
-
- ' 创建 Excel 对象
- Set objExcel = CreateObject("Excel.Application")
- objExcel.Visible = False
- objExcel.DisplayAlerts = False
-
- ' 打开工作簿和工作表
- Set objWorkbook = objExcel.Workbooks.Open(strFilePath)
- Set objWorksheet = objWorkbook.Sheets(strSheetName)
-
- ' 获取最后一行的索引
- intLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 2).End(-4162).Row
-
- ' 创建文件系统对象
- Set objFSO = CreateObject("Scripting.FileSystemObject")
-
- ' 创建输出文件流
- Set objStream = CreateObject("ADODB.Stream")
- objStream.Charset = "UTF-8"
- objStream.Open
- objStream.Type = 2 ' Text
-
- ' 从第2行开始逐行读取数据并写入文件
- For intRow = 2 To intLastRow
- ' 获取第2列(B列)的数据
- Dim birdName
- birdName = objWorksheet.Cells(intRow, 2).Value
-
- ' 将数据写入文件流
- objStream.WriteText birdName & vbCrLf
- Next
-
- ' 保存文件流到文本文件
- objStream.SaveToFile strOutputFile, 2 ' Overwrite
-
- ' 关闭文件和清理对象
- objStream.Close
- Set objStream = Nothing
- Set objFSO = Nothing
-
- ' 关闭工作簿和 Excel
- objWorkbook.Close
- objExcel.Quit
-
- ' 清理对象
- Set objWorksheet = Nothing
- Set objWorkbook = Nothing
- Set objExcel = Nothing
复制代码
作者: Five66 时间: 2023-9-14 16:31
厉害了,可是3楼代码第26行创建的fso好像没用过
作者: thp2008 时间: 2023-9-14 16:38
我也是突然有这个想法,从没有试过,中间出错了5次,我都告诉它,它帮我修改了5次,最终成功了。后来,我还让它帮我加了一些提示的功能,挺好玩的。
作者: buyiyang 时间: 2023-9-14 17:15
用OLEDB试一下- powershell -c "$connection=\"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';\";$dataTable=New-Object System.Data.DataTable;(New-Object System.Data.OleDb.OleDbDataAdapter(\"SELECT * FROM [鸟种数据导出$]\",$connection)).Fill($dataTable)|out-null;$dataTable.Rows|%%{$_[1]}|sc 1.txt"
复制代码
作者: thp2008 时间: 2023-9-14 18:10
本帖最后由 thp2008 于 2023-9-14 18:14 编辑
用OLEDB试一下
buyiyang 发表于 2023-9-14 17:15
- PS D:\Birds\DaoChu> powershell -c "$connection=\"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';\";$dataTable=New-Object System.Data.DataTable;(New-Object System.Data.OleDb.OleDbDataAdapter(\"SELECT * FROM [鸟种数据导出$]\",$connection)).Fill($dataTable)|out-null;$dataTable.Rows|%%{$_[1]}|sc 1.txt"
- 所在位置 行:1 字符: 75
- + ... "$connection=\"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出 ...
- + ~
- Data 节缺少自己的语句块。
- + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
- + FullyQualifiedErrorId : MissingStatementBlockForDataSection
复制代码
- D:\Birds\DaoChu>powershell -c "$connection=\"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';\";$dataTable=New-Object System.Data.DataTable;(New-Object System.Data.OleDb.OleDbDataAdapter(\"SELECT * FROM [鸟种数据导出$]\",$connection)).Fill($dataTable)|out-null;$dataTable.Rows|%%{$_[1]}|sc 1.txt"
- %% : 无法将“%%”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然
- 后再试一次。
- 所在位置 行:1 字符: 294
- + ... ]",$connection)).Fill($dataTable)|out-null;$dataTable.Rows|%%{$_[1]}| ...
- + ~~
- + CategoryInfo : ObjectNotFound: (%%:String) [], CommandNotFoundException
- + FullyQualifiedErrorId : CommandNotFoundException
复制代码
感谢帮助,我感觉,这个应该跟ChatGPT中途一样,应该还是那个极生僻的汉字会出错。后面它用了几种方法不行,就改用了上面那种方式,能成功了。
作者: thp2008 时间: 2023-9-14 19:10
我又想验证一下,又使用ChatGPT阅读了上面的错误信息,给出的正确答案:- $connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';"
- $dataTable = New-Object System.Data.DataTable
- $adapter = New-Object System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [鸟种数据导出$]", $connection)
- $adapter.Fill($dataTable) | Out-Null
-
- $outputFile = "1.txt"
- $startingRow = 2
-
- for ($i = $startingRow - 1; $i -lt $dataTable.Rows.Count; $i++) {
- $value = $dataTable.Rows[$i][1] # 第二列为索引 1
- $value | Out-File -FilePath $outputFile -Append -Encoding UTF8
- }
复制代码
- $connection="Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';";$dataTable=New-Object System.Data.DataTable;(New-Object System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [鸟种数据导出$]",$connection)).Fill($dataTable)|Out-Null;$outputFile="1.txt";$startingRow=2;for($i=$startingRow-1;$i -lt $dataTable.Rows.Count;$i++){$value=$dataTable.Rows[$i][1];$value|Out-File -FilePath $outputFile -Append -Encoding UTF8;}
复制代码
- powershell -c "$connection='Provider=Microsoft.ACE.OLEDB.12.0;Data Source=''鸟种数据导出.xlsx'';Extended Properties=''Excel 12.0 Xml;HDR=YES''';$dataTable=New-Object System.Data.DataTable;(New-Object System.Data.OleDb.OleDbDataAdapter('SELECT * FROM [鸟种数据导出$]',$connection)).Fill($dataTable)|Out-Null;$outputFile='1.txt';$startingRow=2;for($i=$startingRow-1;$i -lt $dataTable.Rows.Count;$i++){$value=$dataTable.Rows[$i][1];$value|Out-File -FilePath $outputFile -Append -Encoding UTF8;}"
复制代码
三种方式,我都测试了一下,测试通过了。
作者: buyiyang 时间: 2023-9-14 20:34
本帖最后由 buyiyang 于 2023-9-14 20:40 编辑
回复 7# thp2008
首先你应该把它放到bat脚本运行,跟编码没有关系。
作者: zbroot 时间: 2023-11-25 09:48
附上,它最终帮我生成的,成功代码,并且还帮我写了注释:
thp2008 发表于 2023-9-14 16:23
看过你发的提取EXCEL文本的帖子,能否帮忙写个小程序? Q 24965
十分感谢
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |