【问题标题】:How do I automate Excel from an HTML Web page by using JScript?如何使用 JScript 从 HTML 网页自动化 Excel?
【发布时间】:2021-10-09 18:52:46
【问题描述】:

根据微软:

How to automate Excel from an HTML Web page by using JScript

总结 本文演示了如何从 HTML 页面创建和操作 Microsoft Office Excel 工作簿。

更多信息 本文说明了使 Excel 自动化的 JScript 代码。 JScript 没有创建 SAFEARRAY 的内部方法。使用自动化时,如果调用需要 SAFEARRAY 的函数,可以使用 VBScript 来创建 SAFEARRAY。下面的代码演示了这种 JScript 和 VBScript 代码的组合。

构建自动化示例 启动记事本。

将以下代码粘贴到记事本中。

<HTML>
<BODY>
Press the button to start Excel and display quarterly data.
<SCRIPT LANGUAGE="VBScript">
Function CreateNamesArray()
' Create an array to set multiple values at once.
  Dim saNames(5, 2)
  saNames(0, 0) = "John"

saNames(0, 1) = "Smith"
  saNames(1, 0) = "Tom"
  saNames(1, 1) = "Brown"
  saNames(2, 0) = "Sue"
  saNames(2, 1) = "Thomas"
  saNames(3, 0) = "Jane"
  saNames(3, 1) = "Jones"
  saNames(4, 0) = "Adam"
  saNames(4, 1) = "Johnson"
  CreateNamesArray = saNames
End Function
</SCRIPT>

<SCRIPT LANGUAGE="JScript"> 
function AutomateExcel()
{

// Start Excel and get Application object.
      var oXL = new ActiveXObject("Excel.Application");

oXL.Visible = true;

// Get a new workbook.
      var oWB = oXL.Workbooks.Add();
      var oSheet = oWB.ActiveSheet;

// Add table headers going cell by cell.
      oSheet.Cells(1, 1).Value = "First Name";
      oSheet.Cells(1, 2).Value = "Last Name";
      oSheet.Cells(1, 3).Value = "Full Name";
      oSheet.Cells(1, 4).Value = "Salary";

// Format A1:D1 as bold, vertical alignment = center.
      oSheet.Range("A1", "D1").Font.Bold = true;
      oSheet.Range("A1", "D1").VerticalAlignment =  -4108; //xlVAlignCenter

// Create an array to set multiple values at once.

// Fill A2:B6 with an array of values (from VBScript).
      oSheet.Range("A2", "B6").Value = CreateNamesArray();

// Fill C2:C6 with a relative formula (=A2 & " " & B2).
      var oRng = oSheet.Range("C2", "C6");
      oRng.Formula = "=A2 & \" \" & B2";

// Fill D2:D6 with a formula(=RAND()*100000) and apply format.
      oRng = oSheet.Range("D2", "D6");
      oRng.Formula = "=RAND()*100000";
      oRng.NumberFormat = "$0.00";

// AutoFit columns A:D.
      oRng = oSheet.Range("A1", "D1");
      oRng.EntireColumn.AutoFit();

// Manipulate a variable number of columns for Quarterly Sales Data.
      DispalyQuarterlySales(oSheet);

// Make sure Excel is visible and give the user control
   // of Excel's lifetime.
      oXL.Visible = true;
      oXL.UserControl = true;
}

function DispalyQuarterlySales(oWS)
{
      var iNumQtrs, sMsg, iRet;

// Number of quarters to display data for.
      iNumQtrs = 4;

// Starting at E1, fill headers for the number of columns selected.
      var oResizeRange = oWS.Range("E1", "E1").Resize(1,iNumQtrs);
      oResizeRange.Formula = "=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\"";

// Change the Orientation and WrapText properties for the headers.
      oResizeRange.Orientation = 38;
      oResizeRange.WrapText = true;

// Fill the interior color of the headers.
      oResizeRange.Interior.ColorIndex = 36;

// Fill the columns with a formula and apply a number format.
      oResizeRange = oWS.Range("E2", "E6").Resize(5,iNumQtrs);
      oResizeRange.Formula = "=RAND()*100";
      oResizeRange.NumberFormat = "$0.00";

// Apply borders to the Sales data and headers.
      oResizeRange = oWS.Range("E1", "E6").Resize(6,iNumQtrs);
      oResizeRange.Borders.Weight = 2;  // xlThin

// Add a Totals formula for the sales data and apply a border.
      oResizeRange = oWS.Range("E8", "E8").Resize(1,iNumQtrs);
      oResizeRange.Formula = "=SUM(E2:E6)";
    // 9 = xlEdgeBottom      
      oResizeRange.Borders(9).LineStyle = -4119; //xlDouble
      oResizeRange.Borders(9).Weight = 4; //xlThick

// Add a Chart for the selected data.

oResizeRange = oWS.Range("E2:E6").Resize(5,iNumQtrs);
      var oChart = oWS.Parent.Charts.Add();
      oChart.ChartWizard(oResizeRange, -4100, null, 2);  // -4100 = xl3dColumn
      oChart.SeriesCollection(1).XValues = oWS.Range("A2", "A6");
      for (iRet = 1; iRet <= iNumQtrs; iRet++) {
         oChart.SeriesCollection(iRet).Name = "=\"Q" + iRet + "\"";
      }
      oChart.Location(2, oWS.Name); // 2 = xlLocationAsObject

// Move the chart so as not to cover your data.
      oWS.Shapes("Chart 1").Top = oWS.Rows(10).Top;
      oWS.Shapes("Chart 1").Left = oWS.Columns(2).Left;
}
</SCRIPT>
<P><INPUT id=button1 type=button value="Start Excel" 
          onclick="AutomateExcel"></P>
</BODY>
</HTML>

将文件保存到您选择的目录,文件名为 Excelaut.htm。

关闭记事本并启动 Internet Explorer。

在地址栏中,键入 C:path\excelaut.htm,其中 path 是您保存文件的目录。

当 Internet Explorer 加载文件时,您会看到一个带有按钮的句子。当您按下按钮时,Excel 将在客户端计算机上启动并填充数据。

这样做会生成一个带有按钮的网页。在任何浏览器中都不执行任何操作。

【问题讨论】:

  • “在任何浏览器中都不做任何事情。”好吧,它只能在 IE 中运行,因为其他浏览器不支持 ActiveX/COM,即使这样,它也只能在安全设置为危险的低级别时运行。如果你想做这样的事情,那么你可能需要使用 HTA(过时但仍然有效......)例如analystcave.com/vbs-hta-example-for-vba-developers
  • IE 在尝试时也不执行任何操作。
  • 就像我注意到的那样,您首先需要进入 Internet 选项并将您的安全设置设置为超低级别才能使其正常工作。绝对不推荐。
  • 也试过了,没用。
  • 您是否在开发者工具控制台中检查了错误?

标签: html excel vba jscript


【解决方案1】:

将它放在一个带有.hta 文件扩展名的文本文件中并打开它。 这只是一个简短的演示,展示了如何从 HTA 打开 Excel。 假设您不在 Mac 上应该可以工作。

 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <title>XLS Data Demo</title>
 
    <hta:application
        applicationname="XLS Data"    
        border="dialog"
        borderstyle="normal"
        caption="Test"
        contextmenu="yes"
        icon=""
        maximizebutton="yes"
        minimizebutton="yes"
        navigable="no"
        scroll="no"
        selection="yes"
        showintaskbar="yes"
        singleinstance="yes"
        sysmenu="yes"
        version="1.0"
        windowstate="normal"
    >
 </head>
 <body>
 Press the button to start Excel and display quarterly data.
<SCRIPT LANGUAGE="JScript"> 
    function AutomateExcel()
    {
        alert("starting excel...");
        /* Start Excel and get Application object. */
        
        var oXL = new ActiveXObject("Excel.Application");
        oXL.Visible = true;
        var oWB = oXL.Workbooks.Add();
        var oSheet = oWB.ActiveSheet;
        oSheet.Cells(1, 1).Value = "First Name";
        oSheet.Cells(1, 2).Value = "Last Name";
        oSheet.Cells(1, 3).Value = "Full Name";
        oSheet.Cells(1, 4).Value = "Salary";
    }
</SCRIPT>
<P><INPUT id=button1 type=button value="Start Excel" 
          onclick="AutomateExcel()"></P>
 </body>
</html>

【讨论】: