首页 > 解决方案 > 带有标题的 Spotfire Webplayer 交叉表导出

问题描述

我需要在 Spotfire 中将 Crosstable 数据与 Header 一起导出。

1) 首先,我尝试使用临时文件夹中的位置或直接位置(如 C:\Export\Text.xls)直接导出 excel。这些在 Spotfire 客户端中运行完美。但是在网络播放器中它不起作用。它正在向文件夹抛出访问问题。

2)其次,我尝试了,在其他论坛的帮助下,我开发了一个代码,通过 Iron python 脚本将 Crosstable 转换为文本区域,通过 JAVA 脚本将 HTML 转换为 excel。这在 webplayer chrome 浏览器中运行完美。但这里的问题是它非常适合小数据。但我必须导出大约 10 MB。所以它挂在客户端和网络播放器中。

谁能帮我解决这个问题。

脚本 1:交叉表到 HTML,然后到 javascript 以供下载。此脚本因数据大小而挂起。当我使用小数据时,它在 chrome 中完美运行。

from Spotfire.Dxp.Application.Visuals import TablePlot, HtmlTextArea, 
CrossTablePlot
ta = visTA.As[HtmlTextArea]()
from System.IO import Path, StreamWriter
from System.Text import StringBuilder
from System.IO import *
tempFilename = MemoryStream();
tp = visDT.As[CrossTablePlot]()
writer = StreamWriter(tempFilename)
tp.ExportText(writer)
tempFilename.Seek(0,SeekOrigin.Begin);
#Build the table
sb = StringBuilder()
#Open the temp file for reading
f = open(tempFilename)
#add some scripting magic from CDN
html = ""
#build the html table
html += " <TABLE id='myTable'>\n"
html += "<THEAD>"
html += " <TR><TH>"
html += "Performance Attribution"
html += " </TH></TR> <TR><TH>"
html += Heading2
html += " </TH></TR> <TR><TH>"
html += Heading6
html += " </TH></TR> <TR><TH>"
html += Heading3
html += " </TH></TR> <TR><TH>"
html += " </TH></TR> <TR><TH><Font Size=3><B>"
html += Heading4
html += "</TD><TD></TD><TD></TD><TD>"
html += Heading5
html += "</TD><TD></TD><TD></TD><TD>"
html += "Attribution Analysis"
html += "</TD><TD></TD></B></Font></TH></TR>"
html += " <TR><TH>"
html += " </TH><TH>".join(f.readline().split("\t")).strip()
html += " </TH></TR>"
html += "</THEAD>\n"
html += "<TBODY>\n"
for line in f:
html += "<TR><TD>"
html += "</TD><TD>".join(line.split("\t")).strip()
html += "</TD></TR>\n"
f.close()
html += "</TBODY>\n"
html += "</TABLE>\n"
ta.HtmlContent = html

Script to Export from Text Area
==============================================================
jQuery.fn.fnExcelReport = function(options)
{
 var options = jQuery.extend({
    separator: ',',
    header: [],
    headerSelector: 'th',
    columnSelector: 'td',
    delivery: 'popup', // popup, value, download
    // filename: 'powered_by_sinri.csv', // filename to download
    transform_gt_lt: true // make &gt; and &lt; to > and <
 },
options);

var tab_text="<table border='2px'><tr bgcolor='#87AFC6'>";
var textRange; var j=0;
//tab = $(this); // id of table
tab = document.getElementById('myTable');
for(j = 0 ; j < tab.rows.length ; j++) 
{     
    tab_text=tab_text+tab.rows[j].innerHTML+"</tr>";
    //tab_text=tab_text+"</tr>";
}

tab_text=tab_text+"</table>";

var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE "); 

 sa = window.open('data:application/vnd.ms-excel,' + 
 encodeURIComponent(tab_text));  
return (sa);
}

$(document).ready(function () {
$('table').each(function () {
var $table = $(this);

var $button = $("<button type='button'>");
$button.text("Download");
$button.insertBefore($table);

$button.click(function () {
var csv = $table.fnExcelReport({
delivery: 'value'
  });
  });
 });
})



#Script 2: This script is working in client and not in web browsers.

from System.IO import *
from System import Environment, Threading 
username = Threading.Thread.CurrentPrincipal.Identity.Name
import clr
clr.AddReference("System.Windows.Forms")
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers 
from System.Windows.Forms import SaveFileDialog
from System.Diagnostics import Process, ProcessStartInfo
from Spotfire.Dxp.Application.Visuals import VisualContent
vc=Visuals.As[VisualContent]()  #Visuals = Script parameter for Table/Cross 
Table visualization
memStream = MemoryStream();
writer = 
Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter);
sWriter = StreamWriter(memStream);
#Exporting the data to Memory Stream
vc.ExportText(sWriter);  #exports data in tab separated text
sReader = StreamReader(memStream);
memStream.Seek(0, SeekOrigin.Begin);
tempFolder = Path.GetTempPath()
Filenm = "Fixed_Income_Performce_Attribution.csv";
str1='\\'
print str1
newtemp = tempFolder
print newtemp
filename=newtemp+Filenm
print filename
f=open(filename,"w+")
counter=0
j=0
str1=''
f.write("Percent of Total Holdings"+'\n')
f.write(Heading2+'\n')
f.write(Heading3+'\n')
f.write(Heading6+'\n')
f.write('\n'+'\n')
while (sReader.Peek()>=0):
line=[]
counter=counter+1 #counts the number of rows in dataset
a=sReader.ReadLine()
lines=a.split("\t")
for elem in lines:
    j=j+1 # counts the number of columns in dataset
    #print elem
    if str(elem).find(",")<>-1:
        elem='"'+elem+'"'  # escaping comma already present in string
    line.append(elem)
 str1 = ','.join(str(e) for e in line)
f.write(str1+'\n')
f.close();
MemoryStream.Dispose(memStream);
sReader.Close()
Process.Start(filename)

谢谢文卡特什

标签: export-to-excelexport-to-csvspotfire

解决方案


对于您的第一个查询(下载到 C:\Export\Text.xls);当这个脚本在网络播放器上运行时,文件将在节点管理器机器上生成(因为这是执行 IP 脚本的地方)。

也许您可以将文件输出到网络/共享驱动器?您需要将网络驱动器路径添加到 Spotfire.Dxp.Worker.Host.exe.config 的允许路径部分,并确保它可以被节点管理器访问。


推荐阅读