Este artigo ilustra um scritpt ASP (Microsoft Active Server Pages) para construir uma planilha no formato XML Spreadsheet (XMLSS) usando o componente Office Spreadsheet. O XMLSS pode ser exibido do lado cliente de uma dentre diversas formas:
- No componente Spreadsheet em uma página da Web
- No Microsoft Excel exibido in-loco no navegador
- Aberto diretamente no Microsoft Excel
Usar um componente Spreadsheet no código do lado servidor para construir planilhas fornece mais escalabilidade e melhor desempenho se comparado com usar uma automação do Microsoft Excel do lado servidor. Não recomendamos usar os aplicativos da Automação do Office, incluindo o Excel, no servidor. Este método deve ser evitado quando outras alternativas para obter os mesmos resultados estiverem disponíveis. O XMLSS pode persistir em muitas das ferramentas comuns ao componente Spreadsheet e o Microsoft Excel. Pastas de trabalho com mais de uma planilha, formatação de célula, Filtro Automático, fórmulas em células e recálculo são alguns desses recursos. O componente Spreadsheet tem um modelo de objeto que corresponde de maneira muito próxima ao modelo de objeto para o Microsoft Excel. Entretanto, se você está familiarizado com o modelo de objeto do Excel, você poderá aplicar parte do seu código do Excel já existente, com modificações, para uso no componente Spreadsheet.
O seguinte exemplo demonstra como gerar uma pasta de trabalho com mais de uma planilha no XMLSS usando o componente Spreadsheet com ASP. O exemplo também discute sobre como exibir o XMLSS resultante do lado cliente em uma página da Web ou no Microsoft Excel.
Script ASP para construir XMLSS usando o componente Spreadsheet
Salve o seguinte ASP como XMLSS.asp no diretório raiz virtual do seu servidor Web. Por padrão, o diretório raiz é C:\inetpub\wwwroot.
<% Language=VBScript %>
<%
Response.Buffer = True
Response.ContentType = "text/xml"
Dim NumOrders, NumProds, r
NumOrders = 300
NumProds = 10
Dim oSS
Dim oOrdersSheet
Dim oTotalsSheet
Dim oRange
Dim c
Set oSS = CreateObject("OWC10.Spreadsheet")
Set c = oSS.Constants
'Rename Sheet1 to "Orders", rename Sheet2 to "Totals" and remove Sheet3
Set oOrdersSheet = oSS.Worksheets(1)
oOrdersSheet.Name = "Orders"
Set oTotalsSheet = oSS.Worksheets(2)
oTotalsSheet.Name = "Totals"
oSS.Worksheets(3).Delete
'=== Build the First Worksheet (Orders) ==============================================
'Add headings to A1:F1 of the Orders worksheet and apply formatting
Set oRange = oOrdersSheet.Range("A1:F1")
oRange.Value = Array("Order Number", "Product ID", "Quantity", "Price", "Discount", "Total")
oRange.Font.Bold = True
oRange.Interior.Color = "Silver"
oRange.Borders(c.xlEdgeBottom).Weight = c.xlThick
oRange.HorizontalAlignment = c.xlHAlignCenter
'Apply formatting to the columns
oOrdersSheet.Range("A:A").ColumnWidth = 20
oOrdersSheet.Range("B:E").ColumnWidth = 15
oOrdersSheet.Range("F:F").ColumnWidth = 20
oOrdersSheet.Range("A2:E" & NumOrders + 1 _
).HorizontalAlignment = c.xlHAlignCenter
oOrdersSheet.Range("D2:D" & NumOrders + 1).NumberFormat = "0.00"
oOrdersSheet.Range("E2:E" & NumOrders + 1).NumberFormat = "0 % "
oOrdersSheet.Range("F2:F" & NumOrders + 1).NumberFormat = "$ 0.00" '"_($* #,##0.00_)"
'Obtain the order information for the first five columns in the Orders worksheet
'and populate the worksheet with that data starting at row 2
Dim aOrderData
aOrderData = GetOrderInfo
oOrdersSheet.Range("A2:E" & NumOrders + 1).Value = aOrderData
'Add a formula to calculate the order total for each row and format the column
oOrdersSheet.Range("F2:F" & NumOrders + 1).Formula = "=C2*D2*(1-E2)"
oOrdersSheet.Range("F2:F" & NumOrders + 1).NumberFormat = "_( $* #,##0.00 _)"
'Apply a border to the used rows
oOrdersSheet.UsedRange.Borders(c.xlInsideHorizontal).Weight = c.xlThin
oOrdersSheet.UsedRange.BorderAround , c.xlThin, 15
'Turn on AutoFilter and display an initial criteria where
'the Product ID (column 2) is equal to 5
oOrdersSheet.UsedRange.AutoFilter
oOrdersSheet.AutoFilter.Filters(2).Criteria.FilterFunction = c.ssFilterFunctionInclude
oOrdersSheet.AutoFilter.Filters(2).Criteria.Add "5"
oOrdersSheet.AutoFilter.Apply
'Add a Subtotal at the end of the usedrange
oOrdersSheet.Range("F" & NumOrders + 3).Formula = "=SUBTOTAL(9, F2:F" & NumOrders + 1 & ")"
'Apply window settings for the Orders worksheet
oOrdersSheet.Activate 'Makes the Orders sheet active
oSS.Windows(1).ViewableRange = oOrdersSheet.UsedRange.Address
oSS.Windows(1).DisplayRowHeadings = False
oSS.Windows(1).DisplayColumnHeadings = False
oSS.Windows(1).FreezePanes = True
oSS.Windows(1).DisplayGridlines = False
'=== Build the Second Worksheet (Totals) ===========================================
'Change the Column headings and hide row headings
oTotalsSheet.Activate
oSS.Windows(1).ColumnHeadings(1).Caption = "Product ID"
oSS.Windows(1).ColumnHeadings(2).Caption = "Total"
oSS.Windows(1).DisplayRowHeadings = False
'Add the product IDs to column 1
Dim aProductIDs
aProductIDs = GetProductIDs
oTotalsSheet.Range("A1:A" & NumProds).Value = aProductIDs
oTotalsSheet.Range("A1:A" & NumProds).HorizontalAlignment = c.xlHAlignCenter
'Add a formula to column 2 that computes totals per product from the Orders Sheet
oTotalsSheet.Range("B1:B" & NumProds).Formula = _
"=SUMIF(Orders!B$2:B$" & NumOrders + 1 & ",A1,Orders!F$2:F$" & NumOrders + 1 & ")"
oTotalsSheet.Range("B1:B" & NumProds).NumberFormat = "_( $* #,##0.00 _)"
'Apply window settings for the Totals worksheet
oSS.Windows(1).ViewableRange = oTotalsSheet.UsedRange.Address
'=== Setup for final presentation ==================================================
oSS.DisplayToolbar = False
oSS.AutoFit = True
oOrdersSheet.Activate
Response.Write oSS.XMLData
Response.End
Function GetOrderInfo()
ReDim aOrderInfo(NumOrders,5)
Dim aPrice, aDisc
aPrice = Array(10.25, 9.5, 2.34, 6.57, 9.87, 4.55, 6, 13.05, 3.3, 5.5)
aDisc = Array(0, 0.1, 0.15, 0.2)
For r = 0 To NumOrders-1
aOrderInfo(r, 0) = "'" & String(7-Len(CStr(r+1)), "0") & r+1 'Col 1 is Order Number
aOrderInfo(r, 1) = Int(Rnd() * NumProds) + 1 'Col 2 is Product ID
aOrderInfo(r, 2) = Int(Rnd() * 20) + 1 'Col 3 is Quantity
aOrderInfo(r, 3) = aPrice(aOrderInfo(r, 1)-1) 'Col 4 is Price
aOrderInfo(r, 4) = aDisc(Int(Rnd() * 4)) 'Col 5 is Discount
Next
GetOrderInfo = aOrderInfo
End Function
Function GetProductIDs()
ReDim aPIDs(NumProds, 1)
For r = 0 To NumProds-1
aPIDs(r, 0) = r+1
Next
GetProductIDs = aPIDs
End Function
%>
Exibir o XMLSS em uma página da Web
Para exibir o XMLSS de exemplo em uma página da Web, é necessário apenas definir a propriedade
XMLURL para o componente Spreadsheet como o URL do ASP, da seguinte forma:
<html>
<body>
<object classid="clsid:0002E551-0000-0000-C000-000000000046" id="Spreadsheet1">
<param name="XMLURL" value="http://YourWebServer/xmlss.asp">
</object>
</body>
</html>
Observação Se você está usando o Microsoft Office 2003, talvez seja necessário alterar o
classid no código acima onde se aplica.
No HTML precedente, a propriedade
XMLURL é definida usando a tag
<param>. É possível também definir a propriedade
XMLURL em tempo de execução se desejado, usando o seguinte código.
Spreadsheet1.XMLURL = "http://YourWebServer/xmlss.asp"
Exibir o XMLSS no Microsoft Excel
O XMLSS que é criado com o componente Spreadsheet pode ser aberto no Microsoft Excel. A formatação e recursos que você implementa no componente Spreadsheet podem ser compartilhados com o Microsoft Excel. O componente Spreadsheet é compatível com alguns recursos que o Excel não suporta. Além disso, o Excel é compatível com alguns recursos que o componente Spreadsheet não suporta. Qualquer tag XML ou atributo que o Excel não implementa são ignorados quando o XMLSS é aberto.
Para ver os resultados do script ASP de exemplo no Microsoft Excel, execute as etapas a seguir:
- Inicie o Microsoft Excel.
- No menu Arquivo, clique em Abrir.
- Na caixa Nome do arquivo, digite http://SeuServidorWeb/xmlss.asp e clique em Abrir.
Examine a pasta de trabalho e observe que os dados e formatos que foram aplicados em tempo de execução estão todos presentes na pasta de trabalho quando ela é aberta no Excel. Existe uma exceção: As legendas dos cabeçalhos que são criados no componente Spreadsheet não são levados para o Excel porque este é um recurso do componente Spreadsheet que o Microsoft Excel não compartilha. Se você cria um XMLSS usando o componente Spreadsheet com o propósito de exibir o arquivo no Excel, esteja atento aos diferentes recursos que cada um suporta.
Outra forma de abrir o XMLSS criado com ASP no Microsoft Excel é fornecendo o tipo Excel Multipurpose Internet Mail Extensions (MIME) como o
ContentType no seu ASP. Ao usar o tipo MIME do Excel e navegar para o seu ASP, o XMLSS pode ser renderizado no Microsoft Excel in-loco no navegador. Para fazer isto, execute as seguintes etapas:
- Abra o XMLSS.asp em um editor de texto.
- Altere a seguinte linha no script:
Response.ContentType = "text/xml"
Altere a linha de código para ficar semelhante ao seguinte:
Response.ContentType = "application/vnd.ms-excel"
- Salve as alterações no XMLSS.asp e inicie o Windows Internet Explorer.
- Vá para http://SeuServidorWeb/XMLSS.asp. A planilha XML é renderizada no Microsoft Excel hospedado in-loco no navegador.
Para obter mais informações, visite o tópico Office Web Components no seguinte site da Microsoft (em inglês):
Para obter mais informações, clique nos números abaixo para ler os artigos na Base de Dados de Conhecimento Microsoft:
285891
(http://support.microsoft.com/kb/285891/
)
Como usar o Visual Basic ou ASP para criar uma planilha XML para o Excel 2002 e Excel 2003
278976
(http://support.microsoft.com/kb/278976/
)
Como usar XSL para transformar uma planilha Excel XML para uso do lado servidor
257757
(http://support.microsoft.com/kb/257757/
)
Considerações sobre a Automação do Office no servidor