将 InDesign 表格导出到 Excel
Exporting InDesign tables to Excel
我一直在测试下面的脚本,它能够 select InDesign 文档中的第一个 table 并将其内容导出到 Excel.
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
exportTable (/* Leave blank for first table in document or specify your table here*/)
function exportTable (myTable) {// Thanks Trevor http://forums.adobe.com/thread/1387437?tstart=0
var doc = app.properties.activeDocument && app.activeDocument,
myTable = myTable || getTable (doc);
if (!myTable) {alert ("Take a break"); exit();};
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i))
{
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
}
else
{
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length,
toRange = GetExcelColumnName (numberOfColumns - 1),
columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i))
{
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
}
else
{
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = [
'''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
''''set newDoc = nothing
set app = nothing
'''
];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {// 0 is A 25 is Z 26 is AA etc.
// parsed from
var dividend = columnNumber + 1,
columnName = "",
modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}
function getTable (doc) { // thanks Marc http://forums.adobe.com/message/6087322#6087322
if (!doc) return false;
app.findTextPreferences = null;
app.findTextPreferences.findWhat = "\x16";
var tables = doc.findText();
if (tables.length) return tables[0].parentStory.tables[0];
return false;
};
我正在尝试让脚本捕获文档中的所有 table 并逐行显示它们。有一个解决方案提供了以下修正,但它会产生运行时错误:
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
var doc = app.properties.activeDocument && app.activeDocument,
myTables = getTable(doc),
n = myTables && myTables.length;
while (n--) exportTable (myTables.tables[0]);
function exportTable (myTable) {// Thanks Trevor http://forums.adobe.com/thread/1387437?tstart=0
var doc = app.properties.activeDocument && app.activeDocument,
myTable = myTable || getTable (doc);
if (!myTable) {alert ("Take a break"); exit();};
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i))
{
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
}
else
{
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length,
toRange = GetExcelColumnName (numberOfColumns - 1),
columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i))
{
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
}
else
{
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = [
'''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
''''set newDoc = nothing
set app = nothing
'''
];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {
var dividend = columnNumber + 1,
columnName = "",
modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}
function getTable (doc) {
if (!doc) return false;
app.findTextPreferences = null;
app.findTextPreferences.findWhat = "\x16";
var tables = doc.findText(true);
if (tables.length) return tables;
return false;
};
它产生的错误是第13行如下:
while (n--) exportTable (myTables.tables[0]);
Error Code# 21: undefined is not an object @ file '~/Library/Preferences/Adobe%20InDesign/Version%2016.0/en_GB/Scripts/Scripts%20Panel/tables-to-excel.jsx' [line:13, col:1]
我的 Javascript 知识非常有限,但我觉得这可能是由于语法过时造成的,但我在网上找不到很多文档来解决这个问题。任何支持将不胜感激。
运行 Adobe Indesign 2021 CC
非常感谢
试试这个:
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
var doc = app.properties.activeDocument && app.activeDocument;
// get all stories
var stories = doc.stories;
var s = stories.length;
// loop through the stories
while (s--) {
// get all tables in a story
var myTables = stories[s].tables;
var n = myTables.length;
// loop trough all the tables
while (n--) exportTable(myTables[n]);
}
// no changes below this line
function exportTable (myTable) {
// Thanks Trevor; http://forums.adobe.com/thread/1387437?tstart=0
if (!myTable) {alert ("Take a break"); exit()}
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i)) {
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
} else {
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length;
var toRange = GetExcelColumnName (numberOfColumns - 1);
var columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i)) {
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
} else {
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = ['''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
'''set newDoc = nothing
set app = nothing
''' ];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {
var dividend = columnNumber + 1;
var columnName = "";
var modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}
我一直在测试下面的脚本,它能够 select InDesign 文档中的第一个 table 并将其内容导出到 Excel.
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
exportTable (/* Leave blank for first table in document or specify your table here*/)
function exportTable (myTable) {// Thanks Trevor http://forums.adobe.com/thread/1387437?tstart=0
var doc = app.properties.activeDocument && app.activeDocument,
myTable = myTable || getTable (doc);
if (!myTable) {alert ("Take a break"); exit();};
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i))
{
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
}
else
{
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length,
toRange = GetExcelColumnName (numberOfColumns - 1),
columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i))
{
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
}
else
{
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = [
'''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
''''set newDoc = nothing
set app = nothing
'''
];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {// 0 is A 25 is Z 26 is AA etc.
// parsed from
var dividend = columnNumber + 1,
columnName = "",
modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}
function getTable (doc) { // thanks Marc http://forums.adobe.com/message/6087322#6087322
if (!doc) return false;
app.findTextPreferences = null;
app.findTextPreferences.findWhat = "\x16";
var tables = doc.findText();
if (tables.length) return tables[0].parentStory.tables[0];
return false;
};
我正在尝试让脚本捕获文档中的所有 table 并逐行显示它们。有一个解决方案提供了以下修正,但它会产生运行时错误:
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
var doc = app.properties.activeDocument && app.activeDocument,
myTables = getTable(doc),
n = myTables && myTables.length;
while (n--) exportTable (myTables.tables[0]);
function exportTable (myTable) {// Thanks Trevor http://forums.adobe.com/thread/1387437?tstart=0
var doc = app.properties.activeDocument && app.activeDocument,
myTable = myTable || getTable (doc);
if (!myTable) {alert ("Take a break"); exit();};
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i))
{
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
}
else
{
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length,
toRange = GetExcelColumnName (numberOfColumns - 1),
columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i))
{
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
}
else
{
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = [
'''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
''''set newDoc = nothing
set app = nothing
'''
];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {
var dividend = columnNumber + 1,
columnName = "",
modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}
function getTable (doc) {
if (!doc) return false;
app.findTextPreferences = null;
app.findTextPreferences.findWhat = "\x16";
var tables = doc.findText(true);
if (tables.length) return tables;
return false;
};
它产生的错误是第13行如下:
while (n--) exportTable (myTables.tables[0]);
Error Code# 21: undefined is not an object @ file '~/Library/Preferences/Adobe%20InDesign/Version%2016.0/en_GB/Scripts/Scripts%20Panel/tables-to-excel.jsx' [line:13, col:1]
我的 Javascript 知识非常有限,但我觉得这可能是由于语法过时造成的,但我在网上找不到很多文档来解决这个问题。任何支持将不胜感激。
运行 Adobe Indesign 2021 CC
非常感谢
试试这个:
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products.
var doc = app.properties.activeDocument && app.activeDocument;
// get all stories
var stories = doc.stories;
var s = stories.length;
// loop through the stories
while (s--) {
// get all tables in a story
var myTables = stories[s].tables;
var n = myTables.length;
// loop trough all the tables
while (n--) exportTable(myTables[n]);
}
// no changes below this line
function exportTable (myTable) {
// Thanks Trevor; http://forums.adobe.com/thread/1387437?tstart=0
if (!myTable) {alert ("Take a break"); exit()}
var numberOfRows = myTable.rows.length,
rowNumber, columnNumber,
rowContents = [],
setRange, openMark, closeMark;
if ($.os.match(/Mac/i)) {
setRange = 'set value of range "A';
openMark = '" to {';
closeMark = '}';
} else {
setRange = 'app.Range("A';
openMark = '") = Array(';
closeMark = ')';
}
for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) {
var numberOfColumns = myTable.rows[rowNumber].columns.length;
var toRange = GetExcelColumnName (numberOfColumns - 1);
var columnContents = [];
for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) {
var cellContents = myTable.rows[rowNumber].cells.everyItem().contents;
columnContents = '"' + cellContents.join('", "') + '"';
}
rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark;
}
var tableData = rowContents.join("\r");
if ($.os.match(/Mac/i)) {
// Thanks Hans http://forums.adobe.com/message/5610204#5610204
myAppleScript = ['tell application "Microsoft Excel"',
'set theWorkbook to make new workbook',
'tell active sheet of theWorkbook',
tableData,
'end tell',
'end tell\r'].join("\r");
app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
// alert (myAppleScript); exit() for Debug
} else {
// Thanks Calos http://forums.adobe.com/message/5610204#5610204
var vbscript = ['''Err.Clear
On Error Resume Next
set app = GetObject(,"Excel.Application")
If (Err.number <> 0) Then
Set app = CreateObject("Excel.Application")
End If
app.visible = true'
set newDoc = app.Workbooks.Add
''',
tableData,
'''set newDoc = nothing
set app = nothing
''' ];
// alert (vbscript); exit() for Debug
var vbfile = File(Folder.temp +"/createXLSfile.vbs");
vbfile.open('w');
vbfile.write(vbscript.join('\r'));
vbfile.close();
vbfile.execute();
$.sleep(750);
vbfile.remove();
}
}
function GetExcelColumnName (columnNumber) {
var dividend = columnNumber + 1;
var columnName = "";
var modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = String.fromCharCode (65 + modulo) + columnName;
dividend = Math.floor((dividend - modulo) / 26);
}
return columnName;
}