JMP能否支持通过JSL格式化Excel全部,
通过社区中关于该主题的多个不同帖子,我相信我知道我的问题的答案。 但是,我仍然会继续总结这个问题,看看是否有其他人走上了这条路。
问题陈述: 在先前接受和认可的模板中生成 Excel 工作簿
不用于辩论: 为什么选择 Excel 输出格式
在阅读以下帖子时:
- https://community.jmp.com/t5/Discussions/Excel-Table-Formatting/mp/33650#M19957
- https://community.jmp.com/t5/Martin-Demel-s-Blog/JMP-and-Excel-A-Never-ending-story-Part-2-cont/ba-p/35941 (以及所有关于主题的相关博客文章)
- https://community.jmp.com/t5/Discovery-Summit-2016/Working-With-Excel-the-Advanced-Edition/ta-p/23969
可以理解,很多重点都放在如何在 Excel 和 JMP 之间导入和导出数据上。 然而,他们都没有真正谈到保留/自定义从 JMP 和 Excel 导出的数据格式。 不管我们喜不喜欢,Excel 仍将存在,并且将持续需要通过 Excel 呈现我们的结果(至少每个用户不能拥有 JMP 许可证)。
鉴于这种背景,我有一个 Excel 模板,我想使用 编辑 Excel 模板中的一些数据JSL最好。 这是我在 JMP 中拥有的一个非常大的应用程序的最后一步。 理想情况下,我只需要让 JMP 编辑模板中的数据并保存工作簿。 不幸的是,正如您所预料的那样,我在 JMP 中打开文件的那一刻,格式进行了一次折腾,给我留下了一个无法真正呈现给用户的乱码格式。
所以,
1. 有没有办法使用 JSL 而不是 VBA 来保留 Excel 模板中的格式并编辑文件中的数据?
2. 假设我之前的问题的答案是“否”,我已经走上了在 R 中使用“XLConnect”包的道路。 然而,这也遇到了麻烦。 我不希望 JMP 社区解决有关为什么 R 包没有产生结果的问题。 如果有人有兴趣提供帮助,请在下面提供 R 代码。还附上了我正在试验的示例模板
# Clear Console and screen
cat("\014") # Clear Console
rm(list = ls(all = TRUE)) # Clear Workspace
options(java.parameters = "- Xmx1024m")
# Load desired packages
suppressPackageStartupMessages(library(XLConnect))
# Define FilePaths
FolderPath <- "C:\\Users\\Temp\\Desktop"
TemplateFilePath <- paste(FolderPath, "LoanTemplate.xlsx", sep = "\\")
OutputFilePath <- paste(FolderPath, "MyLoan.xlsx", sep = "\\")
OutputFilePath1 <- paste(FolderPath, "MyLoan1.xlsx", sep = "\\")
OutputFilePath2 <- paste(FolderPath, "MyLoan2.xlsx", sep = "\\")
# Read Data
TemplateData <- readWorksheetFromFile(TemplateFilePath, sheet = 'Loan Schedule', header = T)
MyData <- TemplateData
MyData[[4]][2] <- 10000
# Set Style Action
setStyleAction(wb, XLC$"STYLE_ACTION.NONE")
# Trial 1
writeWorksheet(OutputFilePath, MyData, 'Loan Schedule', styleAction = XLC$STYLE_ACTION.XLCONNECT, clearSheets = TRUE)
# Trial 2
writeWorksheetToFile(OutputFilePath1, MyData, 'Loan Schedule', styleAction = XLC$STYLE_ACTION.XLCONNECT, clearSheets = FALSE)
#Trial 3
writeWorksheetToFile(OutputFilePath2, MyData, 'Loan Schedule')
回复:JMP 可以通过 JSL 支持 Excel 格式化吗@uday_guntupalli除了编辑 XML 之外,还有一种方法可以编辑 Excel 并保存格式和函数:使用 JMP 函数将 Excel 视为数据库。 我只对具有数据库布局的工作表执行此操作,即列是字段,行是记录。
我不是 SQL 专家,但您可以找到有关使用表更新许多数据库记录的文档。 我将提供一个简单的例子。
下面是一个简单的 Excel 文件的图片,其中包含两个工作表和格式。该文件被称为供应商.xlsx并且要更新的工作表被命名为供应商. 这本书JSL 伴侣,第 2 版, 记录了三个 JMP ODBC 方法:打开数据库() ,新的 SQL 查询()其中一个作者命名为三步法。

此方法可用于执行任何有效的 SQL 语句。下面是使用 SQL 更改一条记录的脚本更新句法。
dbc = create database connection("DSN=Excel Files; DBQ=c:\temp\suppliers.xlsx");
Execute sql(dbc, "SELECT * FROM `suppliers$` WHERE supplier_name = 'Google' ", "READIT"); //example extraction
Execute sql(dbc, "UPDATE `suppliers$`
SET supplier_id = 150,
supplier_name = 'Apple',
city = 'Cupertino'
WHERE supplier_name = 'Google'");
close database connection(dbc);
Before the SQL scriptBefore the SQL scriptSQL脚本之前
After the SQL Update - red box drawnAfter the SQL Update - red box drawnSQL 更新后 - 绘制的红色框
请注意,格式不变。我无法证明数据库更新与另一个表的性能,但系统更新通常非常快。 您可以在 Web 上搜索正确的 SQL 语法。 请注意,如果您对这种方法感兴趣并且拥有 32 位 Microsoft Office,则需要几个步骤来完成机器文件连接的一次性设置(我的机器与 Excel 的连接名为Excel文件).
这不是讨论所有这些的论坛。 如果您需要,我们(作者)会写一份补充文件。
从你上一篇文章来看,你似乎有一个 R 方法可以做你想做的事,所以我不打算回复,但决定关闭/替代方案以将另一种方法添加到组合中。
回复:JMP 可以通过 JSL 支持 Excel 格式化吗@ian_jmp ,
在您分享的示例中,您能否详细说明如何使用 JSL 编辑 XML 中的值?
回复:JMP 可以通过 JSL 支持 Excel 格式化吗这是上一篇文章的多页版本。 备注 JMP 12 仅允许将表格保存到单张 Excel 工作簿。JMP 13 启用该功能创建 Excel 工作簿()但它需要一个 JMP 表名列表,而不是表引用。 JMP 14 允许打开的表名列表或表引用。
下面是它的工作原理:
- 保存附件文件 multi_tblFmt.txt到存储多次使用的程序的路径,将其重命名为具有扩展名 .vbs
- 如果您使用带有 wscript 的 JMP 12 或更高版本(PC 不确定 MAC),请打开 JSL 文件创建ExcelTable_Style.jsl并根据需要更改 .vbs 文件和保存的 Excel 文件 (save_path) 的路径名称。
有趣的是,JMP 使用的 Excel 模板用于:
- JMP v12 和 JMP v13,TableStyleMedium6 是浅绿色,TableStyleMedium2 是蓝色。
- JMP v14 TableStyleMedium6 为蓝色。
使用记事本编辑 .vbs 文件以指定您喜欢的样式。 (在 Excel 中,主页>格式>表格)。
最后注意事项:.vbs 文件包含一个“IF”代码块,可生成交互式消息。 如果以非交互方式运行此脚本,则应删除或注释掉此 if 块。请参阅 .vbs 文件注释。
回复:JMP 可以通过 JSL 支持 Excel 格式化吗这个回复不是为了@uday_guntupalli但对于博客来说,如果这个讨论有追随者,他们希望能够以更令人愉快的格式在 Excel 中保存 JMP 表,其中列标题包含过滤器/切片器。 下面提供的解决方案仅适用于保存的简单情况一.xlsx 文件中的 JMP 表。VBScript 代码需要额外的代码来查找所有工作表并创建一个 for 循环包装器以在每个工作表上运行。 我不擅长 VBS,并从我的另一半那里获得了语法帮助。 如果有兴趣,请发表评论,我们将扩展 VBScript。
下面是它的工作原理:
- 保存附件tblFmt.txt文件到存储多次使用的程序的路径,将其重命名为具有扩展名 .vbs
- 打开 JSL 文件创建ExcelTable_Style.jsl并根据需要更改 .vbs 和保存的 Excel 文件的路径名
vbs代码注意事项:
- 它应用内置的Excel TableStyleMedium6到第一张纸上的表格,该表格生成深蓝色标题、交替的浅蓝色和白色行以及列过滤器(切片器)。
- 页眉字体更改为 Arial Black,大小 12,粗体
- 该表自动适应 EntireColumn。 这可能并非在所有情况下都有用。
通过修改此 JSL 片段中的路径名称,可以在任何 JSL 程序中调用此 VBS 代码
dt << Save("c:/temp/Biggie Class.xlsx");
//command line syntax: wscript path\tblFmt.vbs 'path to excel workbook'
rp4 = RunProgram(Executable("wscript"),
Options({"c:\temp\tblFmt.vbs", "\!"c:\temp\biggie class.xlsx\!""}),
ReadFunction("text")
);
JMP 开发人员注意事项( @ian_jmp ) :我尝试将 Book.xltx 设为我的默认 Excel 模板。 要么我没有成功,要么 JMP 没有使用它。 如果成功,我的 vbs 代码就可以指定自定义表格样式。A愿望清单项,可能是 Create Excel Workbook() 的扩展,具有可选参数来指定 .xltx 模板文件,以及将应用要应用的自定义样式的 TableStyle 名称。我意识到进入 Excel 版本,64 位与 32 位 MicrosoftOffice 的问题等。这在我的列表中并不高,但似乎经常有 Excel 表格请求。
回复:JMP 可以通过 JSL 支持 Excel 格式化吗@gzmorgan0 ,
在简化的示例中使用 VBA 似乎是合理的,但是在我的实际问题陈述中,我需要修改多个值并且我更愿意在没有 VBA 的情况下进行修改。 我能够让 R 代码工作,我正在尝试查看如何使用@ian_jmp建议也是如此。 但是,感谢您为我提供了另一种选择。 圣诞节快乐。
回复:JMP 可以通过 JSL 支持 Excel 格式化吗@uday_guntupalli你的需求不清楚。如果您有一个与您提供的模板类似的模板,其中包含所有宏编码和公式,并且您只需要更改几个值,您可以学习一些 vbscript 命令并使用运行程序(见下文)。
附件是一个将 JMP 文件 Big Class 保存为 xslx 并更改一个单元格格式的脚本,以演示如何使用 JSL 对此进行编码。
我不是 XML 模式专家,因此 Ian 的方法可能正是您所需要的。
JSL 更改本金、天数、利率和额外付款。
Names Default to Here(1);
cmdList={"Dim xlApp",
"\[Set xlApp = CreateObject("Excel.Application")]\",
"xlApp.Visible = True",
"\[xlApp.Workbooks.Open ("C:\TEMP\Loan Template.xlsx")]\",
"'Change the values in cells e3-e5, e9",
"\[xlApp.Range("E3").Select]\",
"\[xlApp.ActiveCell.Value = 10000]\",
"\[xlApp.Range("E4").Select]\",
"\[xlApp.ActiveCell.Value = .044]\",
"\[xlApp.Range("E5").Select]\",
"\[xlApp.ActiveCell.Value = 2]\",
"\[xlApp.Range("E9").Select]\",
"\[xlApp.ActiveCell.Value = 150]\",
"\[xlApp.ActiveWorkbook.SaveAs("C:\TEMP\Loan v2.xlsx")]\",
"xlApp.Quit"
};
vbsTxt = concat items(cmdList, "\!N"); //add new lines aka CR
Save Text File( "c:\temp\jj2.vbs" , vbsTxt);
rp4 = RunProgram(Executable("wscript"),
Options("c:\temp\jj2.vbs"),
ReadFunction("text")
);
Caption( "JuMP has Control", Font( "Arial Black" ), //u is added for spoken voice to say and not spelll JMP.
Font Size( 16 ),
Text Color( "red" ), Spoken(1)
);
wait(2);
Caption(Remove);
//look at the Excel file, the color coding is maintained for new payment schedule
回复:JMP 可以通过 JSL 支持 Excel 格式化吗如果您在使用 R 时遇到问题,您可能会考虑另一种“仅 JMP”路线。 不确定这实际上有多可行。
Names Default To Here( 1 );
// .XLSX is a ZIP file
package = Open( "$DESKTOP/Loan Template.xlsx", zip );
// See what's in the package
dirlist = package << dir;
Print(dirlist);
// Get the XML
xml = package << read(dirlist[9]);
// Manipulate XML with JSL?
Print(xml);
// Update the package
package << Write(dirlist[9], xml );