Board logo

标题: [文件操作] [已解决]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
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. fd = fso.GetFolder(".").Path
  3. Set objExcel = CreateObject("Excel.Application")
  4. Set objBook = objExcel.Workbooks.open(fd&"\测试.xls")
  5. objBook.worksheets(1).activate  '设置第1个工作表为活动工作表
  6. Set objSheet = objBook.activeSheet
  7. For i=5 To 65535  '从第5行开始遍历
  8.     If objSheet.Cells(i, 5).value = "" Then Exit For
  9.     En = objSheet.Cells(i, 5).value  'E列
  10.     Hn = objSheet.Cells(i, 8).value  'H列
  11.     msgbox En &".pdf --> "& Trim(Hn)
  12.     'If not fso.folderExists(Hn) Then fso.CreateFolder Trim(Hn)
  13.     'If fso.fileExists(En&".pdf") Then CreateObject("Wscript.Shell").run "cmd /c move """&En&".pdf"" """&Trim(Hn)&"\""",0
  14. Next
  15. objBook.Close
  16. objExcel.Quit
复制代码

作者: thp2008    时间: 2023-9-14 16:22

刚刚突然想起ChatGPT会写代码,于是我将问题扔给了它。几秒钟就根据我的条件写出了代码,我运行后,报了一个错误,我将错误代码发给了它,很快,它又帮我修正了一下,运行后,部分成功了,但还是出错了,后来我分析了一下出错的地方,可能是由于文字中有极生僻的汉字导致的错误,于是,我将这个原因告诉了它,它又采用了一种新的方式生成了代码,但还是部分出错,最后,我再告诉它错误,最终,它生成了最终的版本,完全没有报错,成功了。哇,AI真好,第一次体验。
作者: thp2008    时间: 2023-9-14 16:23

附上,它最终帮我生成的,成功代码,并且还帮我写了注释:
  1. Option Explicit
  2. Dim objExcel, objWorkbook, objWorksheet
  3. Dim strFilePath, strSheetName, strOutputFile
  4. Dim intRow, intLastRow, intColumn
  5. Dim objFSO, objStream
  6. ' 设置 Excel 文件路径、表名和输出文件路径
  7. strFilePath = "D:\Birds\DaoChu\鸟种数据导出.xlsx"
  8. strSheetName = "鸟种数据导出"
  9. strOutputFile = "BirdName01.txt"
  10. ' 创建 Excel 对象
  11. Set objExcel = CreateObject("Excel.Application")
  12. objExcel.Visible = False
  13. objExcel.DisplayAlerts = False
  14. ' 打开工作簿和工作表
  15. Set objWorkbook = objExcel.Workbooks.Open(strFilePath)
  16. Set objWorksheet = objWorkbook.Sheets(strSheetName)
  17. ' 获取最后一行的索引
  18. intLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 2).End(-4162).Row
  19. ' 创建文件系统对象
  20. Set objFSO = CreateObject("Scripting.FileSystemObject")
  21. ' 创建输出文件流
  22. Set objStream = CreateObject("ADODB.Stream")
  23. objStream.Charset = "UTF-8"
  24. objStream.Open
  25. objStream.Type = 2 ' Text
  26. ' 从第2行开始逐行读取数据并写入文件
  27. For intRow = 2 To intLastRow
  28.     ' 获取第2列(B列)的数据
  29.     Dim birdName
  30.     birdName = objWorksheet.Cells(intRow, 2).Value
  31.    
  32.     ' 将数据写入文件流
  33.     objStream.WriteText birdName & vbCrLf
  34. Next
  35. ' 保存文件流到文本文件
  36. objStream.SaveToFile strOutputFile, 2 ' Overwrite
  37. ' 关闭文件和清理对象
  38. objStream.Close
  39. Set objStream = Nothing
  40. Set objFSO = Nothing
  41. ' 关闭工作簿和 Excel
  42. objWorkbook.Close
  43. objExcel.Quit
  44. ' 清理对象
  45. Set objWorksheet = Nothing
  46. Set objWorkbook = Nothing
  47. 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试一下
  1. 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
  1. 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"
  2. 所在位置 行:1 字符: 75
  3. + ...  "$connection=\"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出 ...
  4. +                                                                  ~
  5. Data 节缺少自己的语句块。
  6.     + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
  7.     + FullyQualifiedErrorId : MissingStatementBlockForDataSection
复制代码
  1. 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"
  2. %% : 无法将“%%”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然
  3. 后再试一次。
  4. 所在位置 行:1 字符: 294
  5. + ... ]",$connection)).Fill($dataTable)|out-null;$dataTable.Rows|%%{$_[1]}| ...
  6. +                                                                ~~
  7.     + CategoryInfo          : ObjectNotFound: (%%:String) [], CommandNotFoundException
  8.     + FullyQualifiedErrorId : CommandNotFoundException
复制代码
感谢帮助,我感觉,这个应该跟ChatGPT中途一样,应该还是那个极生僻的汉字会出错。后面它用了几种方法不行,就改用了上面那种方式,能成功了。
作者: thp2008    时间: 2023-9-14 19:10

我又想验证一下,又使用ChatGPT阅读了上面的错误信息,给出的正确答案:
  1. $connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='鸟种数据导出.xlsx';Extended Properties='Excel 12.0 Xml;HDR=YES';"
  2. $dataTable = New-Object System.Data.DataTable
  3. $adapter = New-Object System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [鸟种数据导出$]", $connection)
  4. $adapter.Fill($dataTable) | Out-Null
  5. $outputFile = "1.txt"
  6. $startingRow = 2
  7. for ($i = $startingRow - 1; $i -lt $dataTable.Rows.Count; $i++) {
  8.     $value = $dataTable.Rows[$i][1]  # 第二列为索引 1
  9.     $value | Out-File -FilePath $outputFile -Append -Encoding UTF8
  10. }
复制代码
  1. $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;}
复制代码
  1. 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