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')
Re: 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 scriptSQL 脚本之前
After the SQL Update - red box drawnSQL 更新后 - 绘制的红色框
请注意,格式未更改。我无法用另一个表证明数据库 UPDATE 的性能,但系统更新通常非常快。 您可以在网络上搜索正确的 SQL 语法。 请注意,如果您对此方法感兴趣并且拥有 32 位 Microsoft Office,则需要几个步骤来完成机器文件连接的一次性设置(我的机器与 Excel 的连接名为Excel 文件)。
这不是讨论所有这些的论坛。 如果您要求,我们(作者)会写一份补充文件。
从您的上一篇文章来看,您似乎有一个 R 方法可以做任何您想做的事情,所以我不打算回复,但决定关闭/替代以添加另一种方法。
Re: JMP 可以通过 JSL 支持 Excel 格式化吗@ian_jmp ,
在您分享的示例中,您能否详细说明如何使用 JSL 编辑 XML 中的值?
Re: JMP 可以通过 JSL 支持 Excel 格式化吗这是上一篇文章的多页版本。 注意 JMP 12 仅允许将表格保存到单张 Excel 工作簿。JMP 13 启用该功能创建 Excel 工作簿()但它需要 JMP 表名列表,而不是表引用。 JMP 14 允许列出已打开的表名或表引用。
下面是它的工作原理:
- 保存附件文件 multi_tblFmt.txt到您存储多次使用的程序的路径,将其重命名为具有扩展名 .vbs
- 如果您将 JMP 12 或更高版本与 wscript 一起使用(PC 不确定 MAC),请打开 JSL 文件创建ExcelTable_Style.jsl如果需要,更改 .vbs 文件和保存的 Excel 文件 (save_path) 的路径名。
有趣的是,JMP 使用的 Excel 模板:
- JMP v12 和 JMP v13,TableStyleMedium6 是 Aqua 颜色,TableStyleMedium2 是蓝色。
- JMP v14 TableStyleMedium6 是蓝色的。
使用记事本编辑 .vbs 文件以指定您喜欢的样式。 (在 Excel 中,主页>格式>表格)。
最后说明:.vbs 文件包含一个“IF”代码块,可生成交互式消息。 如果以非交互方式运行此脚本,则应删除或注释掉此 if 块。请参阅 .vbs 文件注释。
Re: JMP 可以通过 JSL 支持 Excel 格式化吗这个回复不太适合@uday_guntupalli但是对于博客,如果此讨论有追随者希望能够以更令人愉悦的格式在 Excel 中保存 JMP 表,其中列标题包含过滤器/切片器。 下面提供的解决方案仅适用于简单的保存情况一.xlsx 文件中的 JMP 表。VBScript 代码需要额外的代码来查找所有工作表并创建一个 for 循环包装器以在每个工作表上运行。 我不擅长 VBS,并从我的另一半那里获得了语法帮助。 如果有兴趣,发表评论,我们将扩展 VBSCript。
下面是它的工作原理:
- 保存附件tblFmt.txt到您存储多次使用的程序的路径,将其重命名为具有扩展名 .vbs
- 打开 JSL 文件创建ExcelTable_Style.jsl如果需要,更改 .vbs 和保存的 Excel 文件的路径名
关于 vbs 代码的注意事项:
- 它应用了内置的 Excel表样式中6到第一张表上的表格,该表格产生深蓝色标题、交替的浅蓝色和白色行以及列过滤器(切片器)。
- 标题字体更改为 Arial Black,大小 12,粗体
- 该表自动适合整个列。 这可能并非在所有情况下都有用。
通过修改此 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 代码可以指定自定义表格样式。一个愿望清单项,可能是 Create Excel Workbook() 的扩展,以具有用于指定 .xltx 模板文件的可选参数,以及将应用要应用的自定义样式的 TableStyle 名称。我意识到进入 Excel 版本,64 位与 32 位 MicrosoftOffice 的问题等。这在我的列表中并不高,但似乎有频繁的 Excel 表请求。
Re: JMP 可以通过 JSL 支持 Excel 格式化吗@gzmorgan0 ,
在简化示例中使用 VBA 似乎是合理的,但是在我的实际问题陈述中,我需要修改多个值,并且我更愿意在没有 VBA 的情况下这样做。 我能够让 R 代码工作,我正在尝试了解如何使用@ian_jmp建议也是如此。 但是,感谢您为我提供了另一种选择。 圣诞节快乐。
Re: 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
Re: 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 );