使用 IronPython 脚本将数据表从 Spotfire 导出到 CSV

Export Datatables from Spotfire to CSV using IronPython Script

我有一个 IronPython 脚本,用于从 Spotfire 项目导出我的所有数据表。

目前它运行良好。它遍历所有数据表并将它们导出为“.xlsx”。现在我需要将文件导出为“.csv”,我认为这就像将“.xlsx”更改为“.csv”一样简单。

此脚本仍会导出文件,将它们全部命名为 .csv,但文件中的内容是 .xlsx,我不确定如何或为什么。代码只是更改文件扩展名,但没有将文件转换为 csv。

这是我目前使用的代码:

我已经在底部发布了完整的代码,我认为与我的问题相关的代码在顶部的单独代码块中。

if(dialogResult == DialogResult.Yes):
    for d in tableList: #cycles through the table list elements defined above
        writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter)
        table =  Document.Data.Tables[d[0]] #d[0] is the Data Table name in the Spotfire project (defined above)
        filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() #OR pass the filter
        stream = File.OpenWrite(savePath+'\'+ d[1] +".csv") #d[1] is the Excel alias name. You could also use d.Name to export with the Data Table name
        names = []
        for col in table.Columns: 
            names.append(col.Name)
        writer.Write(stream, table, filtered, names)
        stream.Close()

我认为这可能与 ExcelXlsDataWriter 有关。 我也尝试使用 ExcelXlsxDataWriter。有没有我可以使用的 csv 编写器?我相信 csv 和 txt 文件有不同的作者。

感谢任何帮助。

完整脚本如下所示:

import System
import clr
import sys

clr.AddReference("System.Windows.Forms")
from sys import exit
from System.Windows.Forms import FolderBrowserDialog, MessageBox, MessageBoxButtons, DialogResult
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File, FileStream, FileMode

#This is a list of Data Tables and their Excel file names. You can see each referenced below as d[0] and d[1] respectively.
tableList = [
            ["TestTable1"],
            ["TestTable2"],
            ]

#imports the location of the file so that there is a default place to put the exports.
from Spotfire.Dxp.Application import DocumentMetadata
dmd = Application.DocumentMetadata #Get MetaData
path = str(dmd.LoadedFromFileName) #Get Path
savePath = '\'.join(path.split('\')[0:-1]) + "\DataExports\"

dialogResult = MessageBox.Show("The files will be save to "+savePath
                +". Do you want to change location?"
                , "Select the save location", MessageBoxButtons.YesNo)
if(dialogResult == DialogResult.Yes):
    # GETS THE FILE PATH FROM THE USER THROUGH A FILE DIALOG instead of using the file location
    SaveFile = FolderBrowserDialog()
    SaveFile.ShowDialog()
    savePath = SaveFile.SelectedPath

#message making sure that the user wants to exporthe files.
dialogResult = MessageBox.Show("Export Files."
                                +"  Export Files","Are you sure?", MessageBoxButtons.YesNo)
if(dialogResult == DialogResult.Yes):
    for d in tableList: #cycles through the table list elements defined above
        writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter)
        table =  Document.Data.Tables[d[0]] #d[0] is the Data Table name in the Spotfire project (defined above)
        filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() #OR pass the filter
        stream = File.OpenWrite(savePath+'\'+ d[1] +".csv") #d[1] is the Excel alias name. You could also use d.Name to export with the Data Table name
        names = []
        for col in table.Columns: 
            names.append(col.Name)
        writer.Write(stream, table, filtered, names)
        stream.Close()

#if the user doesn't want to export then he just gets a message
else:
    dialogResult = MessageBox.Show("ok.")

出于某种原因,Spotfire Iron Python 实现不支持 Python 中实现的 csv 包。

我发现您实施的解决方法是使用 StdfDataWriter 而不是 ExcelXsDataWriter。 STDF 数据格式是 Spotfire Text Data Format. The DataWriter class in Spotfire supports only Excel and STDF (see here),STDF 最接近 CSV。

from System.IO import File
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers

writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.StdfDataWriter)
table = Document.Data.Tables['DropDownSelectors']
filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet()
stream = File.OpenWrite("C:\Users\KLM68651\Documents\dropdownexport.stdf")
names =[]
for col in table.Columns:
    names.append(col.Name)
writer.Write(stream, table, filtered, names)
stream.Close()

希望对您有所帮助