2017-01-16 6 views
0

Я добавил таблицу в документ InDesign и заполненные данные в том же месте с помощью javascript. Но в одном месте мне нужно будет отображать горизонтальную гистограмму в зависимости от процента в ячейке таблицы. Ниже показано, как должен быть результат вывода? Required OutputГистограмма в ячейке таблицы InDesign с использованием javascript

На рисунке ниже это то, что я заселена The table which I have populated

Кто-нибудь, пожалуйста, дайте мне знать, как это может быть сделано? Ниже приведен мой код для этого.

main(); 

    function main(){ 

     var inputBuild = "/C/Test/xml/A"; 
     var inputIndt = "/C/Test/indt/B"; 
     // Read indt file object. 
     var curFile = File (inputIndt+"/Draft.indt"); 
     // check if the file exists 
     if (!curFile.exists) { 
      alert ("no template!"); 
      exit(); 
     } 
     // open the file 
     var curDoc = app.open(curFile); 

     // Reading xml file file 
     xmlFile = new File(inputBuild+"/Build.xml"); 
     if (!xmlFile.exists) exit();  

     xmlFile.open("r"); 
     xmlStr = xmlFile.read(); 
     xmlFile.close(); 
     root = new XML(xmlStr); 

     // Get text frames start 
     var curLayer = curDoc.layers[0]; 

     tfTableFP = curLayer.textFrames.item("Tab_Fund_Position"); 

     loadDataToTables(root, curLayer, ''); 

    } 

    function loadDataToTables(root, curLayer, reportId){ 

     var fundPosTable = tfTableFP.tables[0]; 

     loadDataToFundPosition(root,fundPosTable); 
    } 

    function loadDataToFundPosition(root,tblName){ 
     var fundPositionList = root.xpath("/Component/FundPositions/TableData/Item"); 
     var rowCount = fundPositionList.length(); 

     if(rowCount != 0){ 

      tblName.bodyRowCount = rowCount; 

      for(counter = 0; counter < tblName.rows.length; counter++){ 

       if (counter == 0 || counter == 1){ 

       }else{ 
       tblRow = tblName.rows.item(counter); 

       component = fundPositionList[counter-2]; 

       for(cellCounter = 0; cellCounter < tblRow.cells.length; cellCounter++){ 
        if(cellCounter == 0){ 
         tblString = component.AssetGroup; 
         tblRow.cells.item(cellCounter).contents = tblString.toString(); 
        }else if(cellCounter == 1){ 
/*Progress bar/bar graph for negative data to be populated in this cell*/ 
         tblString = component.NetMarketExposure; 
         tblRow.cells.item(cellCounter).contents = tblString.toString(); 
        }else if(cellCounter == 2){ 
/*Progress bar/bar graph for positive data to be populated in this cell*/ 
         tblString = component.StrategicAllocation; 
         tblRow.cells.item(cellCounter).contents = tblString.toString(); 
        }else if(cellCounter == 3){ 
         tblString = component.FlexibleOverlay; 
         tblRow.cells.item(cellCounter).contents = tblString.toString(); 
        }else if(cellCounter == 4){ 
         tblString = component.NetRange; 
         tblRow.cells.item(cellCounter).contents = tblString.toString(); 
        } 

       } 
       } 
      } 
     } 
    } 

build.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<Component ID="645248" asmid="1" def="Sheet" type="Document"> 
<FundPositions> 
<TableData> 
<Item> 
<RowRank>9</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test1</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>28.38%</ActiveSecurity> 
<DerivativeOverlay>-13.34%</DerivativeOverlay> 
<NetMarketExposure>15.04%</NetMarketExposure> 
<StrategicAllocation>35%</StrategicAllocation> 
<FlexibleOverlay>+/- 35%</FlexibleOverlay> 
<NetRange>0% to 70%</NetRange> 
</Item> 
<Item> 
<RowRank>9</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test2</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>29.17%</ActiveSecurity> 
<DerivativeOverlay>-1.36%</DerivativeOverlay> 
<NetMarketExposure>27.80%</NetMarketExposure> 
<StrategicAllocation>30%</StrategicAllocation> 
<FlexibleOverlay>+/- 30%</FlexibleOverlay> 
<NetRange>0% to 60%</NetRange> 
</Item> 
<Item> 
<RowRank>2</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test3</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>14.72%</ActiveSecurity> 
<DerivativeOverlay>0.00%</DerivativeOverlay> 
<NetMarketExposure>14.72%</NetMarketExposure> 
<StrategicAllocation>15%</StrategicAllocation> 
<FlexibleOverlay>+/- 20%</FlexibleOverlay> 
<NetRange>-5% to 35%</NetRange> 
</Item> 
<Item> 
<RowRank>2</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test4</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>17.15%</ActiveSecurity> 
<DerivativeOverlay>0.00%</DerivativeOverlay> 
<NetMarketExposure>17.15%</NetMarketExposure> 
<StrategicAllocation>15%</StrategicAllocation> 
<FlexibleOverlay>+/- 20%</FlexibleOverlay> 
<NetRange>-5% to 35%</NetRange> 
</Item> 
<Item> 
<RowRank>3</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test5</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>5.34%</ActiveSecurity> 
<DerivativeOverlay>0.00%</DerivativeOverlay> 
<NetMarketExposure>5.34%</NetMarketExposure> 
<StrategicAllocation>5%</StrategicAllocation> 
<FlexibleOverlay>+/- 15%</FlexibleOverlay> 
<NetRange>-10% to 20%</NetRange> 
</Item> 
<Item> 
<RowRank>1</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>detail</RowType> 
<AssetGroup>Test6</AssetGroup> 
<AssetDetail>Cash &amp; Cash Equivalents</AssetDetail> 
<ActiveSecurity>18.24%</ActiveSecurity> 
<DerivativeOverlay>0.91%</DerivativeOverlay> 
<NetMarketExposure>19.15%</NetMarketExposure> 
<StrategicAllocation>N/A</StrategicAllocation> 
<FlexibleOverlay>N/A</FlexibleOverlay> 
<NetRange>N/A</NetRange> 
</Item> 
<Item> 
<RowRank>2</RowRank> 
<Port_ID>201</Port_ID> 
<RowType>asset_group total</RowType> 
<AssetGroup>Test7</AssetGroup> 
<AssetDetail>N/A</AssetDetail> 
<ActiveSecurity>-16.25%</ActiveSecurity> 
<DerivativeOverlay>17.06%</DerivativeOverlay> 
<NetMarketExposure>0.80%</NetMarketExposure> 
<StrategicAllocation>N/A</StrategicAllocation> 
<FlexibleOverlay>N/A</FlexibleOverlay> 
<NetRange>N/A</NetRange> 
</Item> 
</TableData> 
<FundPositions_Summary>Net Market exposure summary</FundPositions_Summary> 
<FundPositions_Total>100.00%</FundPositions_Total> 
</FundPositions> 
</Component> 
+0

Эй! друзья знали, как это сделать? – yatinbc

ответ

0

Учитывая, что проценты записываются в форме -XX%, -xx.xx%, хх%, xx.xx% и что ваш документ имеет значение два стиля объекта названный красный и зеленый, вот подход:

var main = function() { 
 
\t var doc = app.properties.activeDocument; 
 
\t if (!doc) return; 
 
\t 
 
    var green = doc.objectStyles.itemByName ("green"); 
 
    var red = doc.objectStyles.itemByName ("red"); 
 
    
 
    if (!green.isValid || !red.isValid) { 
 
     alert("A green a/o red object styles is(are) missing. Please create those and run again."); 
 
     return; 
 
    } 
 
    
 
\t var fgp = app.findGrepPreferences.properties; 
 
\t app.findGrepPreferences = null; 
 
\t 
 
\t app.findGrepPreferences.properties = { 
 
\t \t findWhat : "^-?\\d+(\\.\\d+)? ?%$", 
 
\t } 
 
\t 
 
\t var found = doc.findGrep(); 
 
\t var n = found.length; 
 
\t 
 
\t if(!n) { 
 
\t \t alert("sorry no % values found"); 
 
\t \t return; 
 
\t } 
 
    
 
    
 
    
 
    
 
\t var para, isPositive, pCell, cellWidth, cellHeight, 
 
     bottom, left, right, top, pct, rectWidth; 
 
\t var max = 150; 
 
\t 
 
\t while (n--) { 
 
\t \t para = found[n]; 
 
     pCell = para.parent; 
 
     
 
\t \t if (pCell instanceof Cell) { 
 
      
 
\t \t \t isPositive = para.contents[0]!="-"; 
 
\t \t \t 
 
      cellWidth = pCell.width; 
 
      cellHeight = pCell.height; 
 
      bottom = pCell.bottomInset; 
 
      left = pCell.leftInset; 
 
      right = pCell.rightInset; 
 
      top = pCell.topInset; 
 
      
 
      cellWidth = (cellWidth-left-right)*.75; 
 
      textWidth = (para.endHorizontalOffset - para.horizontalOffset)*1.1; 
 
      pct = Number(para.contents.replace(/[\-%]/g, "")); 
 
      
 
      rectWidth = (cellWidth*pct)/max; 
 
      
 
      para.insertionPoints[isPositive? 0 : -1 ].rectangles.add({ 
 
       geometricBounds:[0, 0, cellHeight-top-bottom, rectWidth], 
 
      }).appliedObjectStyle = (isPositive? green : red), 
 
      
 
      para.insertionPoints[isPositive? 1 : -1 ].contents = " "; 
 
\t \t \t 
 
\t \t } 
 
\t \t 
 
\t } 
 
\t 
 
\t 
 
\t app.findGrepPreferences.properties = fgp; 
 
} 
 

 
var u; 
 

 
app.doScript ("main()",u,u,UndoModes.ENTIRE_SCRIPT, "The Script");

enter image description here

+0

Привет, я добавил свой код для заполнения данных в таблице, где я нахожу трудности, интегрируя их с вашим решением. – yatinbc

+0

Ваш код кажется более сложным, чем нужно, но трудно предложить дополнительную помощь без четкого понимания структуры xml и того, чего вы намереваетесь достичь точно. – Loic

+0

Я добавил свой xml в отредактированный пост. Я хочу получить эти столбцы/график выполнения в ячейке таблицы, соответствующие количеству% tage, заполненному ячейке – yatinbc

0

Хорошо, поэтому вы можете использовать этот фрагмент, чтобы заполнить таблицу, а затем запустить предыдущий скрипт для баров. Однако большинство значений будут терпеть неудачу, поскольку они не покрываются выражением grep. Позволит вам работать над этой частью.

var baseUrl = Folder.desktop+"/xml"; 
 
//replace by /C/Test/xml on your side 
 

 
var main = function() { 
 
\t var doc, 
 
\t tf, tb; 
 
\t 
 
\t var inputBuild = baseUrl+"/A"; 
 
    var inputIndt =baseUrl+"/B"; 
 
\t 
 
\t var build = File (inputBuild+"/Build.xml"); 
 
\t var template = File (inputIndt+"/Draft.indt"); 
 
\t 
 
\t if (!build.exists || !template.exists) { 
 
\t \t alert ("a file is missing"); 
 
\t \t return; 
 
\t } 
 

 
\t doc = app.open (template); 
 
\t tf = doc.layers[0].textFrames.itemByName ("Tab_Fund_Position"); 
 
\t if (!tf.isValid) { 
 
\t \t alert("Couldn't locate Tab_Fund_Position text frame on layer 1"); 
 
\t \t return; 
 
\t } 
 

 
\t tb = tf.parentStory.tables[0]; 
 
\t 
 
\t if (!tb.isValid) { 
 
\t \t alert("Couldn't locate a table in Tab_Fund_Position text frame"); 
 
\t \t return; 
 
\t } 
 
\t 
 
\t try { 
 
\t \t populateTable (tb, build); 
 
\t } 
 
\t catch(err) { 
 
\t \t alert(err.line+"//"+err.message); 
 
\t } 
 
} 
 

 
function populateTable (table, xmlFile) { 
 
\t \t var x = getXML(xmlFile); 
 
\t \t var items = x..Item, n = items.length(), i = 0, content = [], item, u = "", 
 
\t \t nme, sal, fxo, nrg; \t \t 
 
\t \t if (!n) { 
 
\t \t \t throw new Error ("No data found in XML"); 
 
\t \t } 
 
\t 
 
\t \t table.bodyRowCount = n*5; 
 
\t \t table.columnCount = 3; 
 
\t 
 
\t \t while (i<n) { 
 
\t \t \t item = items[i]; 
 
\t \t \t nme = String(item.NetMarketExposure); 
 
\t \t \t sal = String(item.StrategicAllocation); 
 
\t \t \t fxo = String(item.FlexibleOverlay); 
 
\t \t \t nrg = String(item.NetRange); 
 
\t \t \t content = content. 
 
\t \t \t \t concat ( 
 
\t \t \t \t \t [String(item.AssetGroup),u,u] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t ["NetMarketExposure"] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t nme[0]=="-"? [nme, u ] : [u, nme ] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t ["StrategicAllocation"] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t sal[0]=="-"? [sal, u ] : [u, sal] 
 
\t \t \t \t). 
 
\t \t \t \t concat ( 
 
\t \t \t \t \t ["FlexibleOverlay"] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t fxo[0]=="-"? [fxo, u ] : [u, fxo] 
 
\t \t \t \t). 
 
\t \t \t \t concat ( 
 
\t \t \t \t \t ["NetRange"] 
 
\t \t \t \t). 
 
\t \t \t \t concat (
 
\t \t \t \t \t nrg[0]=="-"? [nrg, u ] : [u, nrg] 
 
\t \t \t \t); 
 
\t \t \t i++; 
 
\t \t } 
 
\t 
 
\t 
 
\t \t table.contents = content; 
 
} 
 

 
function getXML(xmlFile) { 
 
\t var c, x; 
 
\t xmlFile.encoding = "UTF-8"; 
 
\t xmlFile.open('r'); 
 
\t c = xmlFile.read(); 
 
\t xmlFile.close(); 
 
\t return XML(c); 
 
} 
 

 
var u; 
 

 
app.doScript ("main()",u,u,UndoModes.ENTIRE_SCRIPT, "The Script");

+0

Я не получаю. Будет ли вышеприведенная строка кода достаточной для решения, или мне нужно объединиться с ниже кодом. Когда я попытался выполнить приведенный ниже код, появилось два предупреждения в коде. как создать эти стили и как получить findGrep и длину для того же самого. – yatinbc

+0

эй! Пожалуйста, exlpain – yatinbc

+0

Нет необходимости объединять оба кода. Второй вопрос касается заполнения данных, когда первый имеет дело с добавлением баров. Можно объединить оба, но это было слишком много для меня в мои таймфреймы. Извини за это. – Loic