使用 vbscript 填充预先存在的 Excel 表单
Posted
技术标签:
【中文标题】使用 vbscript 填充预先存在的 Excel 表单【英文标题】:Filling pre-exisitng Excel form using vbscript 【发布时间】:2016-10-05 15:39:49 【问题描述】:运行一个旧的经典 ASP 站点,到目前为止,我用 html 制作了自己的“Excel”文件,该文件被发送到我们的会计部门。他们已经修改了他们希望我们使用的 Excel 文件,所以我不能使用我的旧方法。所以我直接连接到excel文件(ADODB),我可以很容易地更新必要的单元格。问题是他们在“表单”底部添加了一些字段,包括一些带有 SUM() 公式的字段,并在中间留下了 34 行条目。我们往往需要更多。
我尝试过“插入”sql,并尝试过“rs.AddNew”,它们都将数据放入我目标范围以下的行中;很公平。但是新行没有添加到文件中 - 数据进入下面的行。这不像在 Excel 中手动插入一行,然后将任何较低的行向下推。有谁知道我如何通过 ADO/SQL 做到这一点?还是根本不可能?
作为最后的手段,我只需要创建一个额外的文档来保存超过 34 个条目的溢出。
谢谢!
我终于找到了reflects my problem的东西,但它是VBA(我认为):
Const xlDown = -4121
Set objExcel = CreateObject(“Excel.Application”)
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open(“C:\Scripts\Test.xls”)
Set objWorksheet = objWorkbook.Worksheets(1)
Set objRange = objExcel.Range(“A1”)
objRange.End(xlDown).Activate
intRow = objExcel.ActiveCell.Row
intColumn = objExcel.ActiveCell.Column
Set objRange = objWorksheet.Cells(intRow, intColumn).EntireRow
For i = 1 to 10
objRange.Insert(xlShiftDown)
Next
For i = 1 to 10
objExcel.Cells(intRow, 1).Value = i
intRow = intRow + 1
Next
strFormula = “=SUM(A1:A” & intRow – 1 & “)”
objExcel.Cells(intRow, 1).Formula = strFormula
有什么方法可以在 VBscript 中的服务器上进行这项工作??? :-)
【问题讨论】:
ADODB 不会扩展它的行。您可以添加行,但您需要从 new 连接重新查询(即不仅仅是从现有连接重新查询)才能访问它们。见google.com.au/… 我不需要在 Excel 文件中重新查询。我正在创建一个一次性文件,通过电子邮件发送给我们的会计部门,他们使用 SAP 来提取数据。我唯一的问题是,例如,如果我们有 45 个事务要添加到 Excel 文件中,“他们”只为这些数据放入 34 行。现在,如果我手动编辑文件,我可以根据需要插入额外的行。但是我的脚本为 5 个不同的部门执行此操作,并且我正在尝试将其自动化。 ;-) 您可以在末尾插入行,但需要重新查询新连接才能访问它们。 对不起,Noodles,我解释得不对,因为我不需要再次访问它们。我需要插入它们,但我打算插入它们的位置是在其他信息的行中间。会计部门在其“表格”中容纳 34 行;如果我的数据行多于 34 行,我需要在一些具有公式的单元格上方插入(如创建)它们。到目前为止,我还没有找到用 ADODB 做到这一点的方法。而且可能没有办法。我希望清除我不需要再次查询文件。 我明白了。我在说什么是可能的。我正在解释 ADODB 和 Excel 的局限性。如果您想要对文件进行有限控制,请使用 COM。 ADODB 用于访问数据库(表格)而不是电子表格(临时组织),因此它将电子表格视为数据库,因此它们应该只是表格。 【参考方案1】:由于您无法使用 ADO 执行此操作(最终会覆盖您的公式),您需要直接访问工作簿。您找到的代码很接近,但下面的内容应该适合您的需求。如果您需要任何进一步的解释,请告诉我?
Option Explicit
Const xlDown = -4121
Const xlUp = -4162
Dim objExcel, objWorkbook, objRange, iLastRow, myRecordCount, numInserts, intLoop
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1) ' refers to first worksheet
iLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 1).End(xlUp).Row
Set objRange = objWorksheet.Cells(iLastRow, 1).EntireRow
' myRecordCount will need to hold the number of records you have
If myRecordCount > 34 Then
numInserts = myRecordCount - 34 ' get the number of rows to be inserted
Else
numInserts = 0
End If
For intLoop = 1 to numInserts
' for as many rows as we need, insert above the formula
objRange.Insert(xlShiftDown)
Next
' insert your data into the worksheet here
objWorkbook.Save
objWorkbook.Close
objExcel.Quit
' send the file out however you're sending it
【讨论】:
谢谢,戴夫。我会试试看 - 我想知道CreateObject("Excel.Application")
,因为代码在我的学校董事会运行的网络服务器上,如果没有安装 Excel,我不会感到惊讶。以上是关于使用 vbscript 填充预先存在的 Excel 表单的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何将 LoopBack 框架应用程序连接到预先存在的/数据填充的 MySQL 数据库/数据源?
使用Springboot进行表单管理 - 当用户选择预先输入时自动填充表单
vbscript 使用节点根据模板批量生成文件并使用VBScript自动填写excel
如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?