I am new to appian
I need read excel data along with header which is dynamic it will change for excel to excel some fileds are static and insert them into a staging table both header and data for that column . my staging table contains fileds like attribute1, reason1, score1 till 20 . I want to insert headers to attriubute field from 1st row and reason and score to data from second row
I am trying with readexcelsheet/readexcelwithfiter/readexcelwithpaging functions but since its dynamic i am having confusion how to do the mapping
Imp : Number of header column and name of the header column will be dynamic
Can anyone help me how to do or is there any other approaches there ?
Discussion posts and replies are publicly visible
Hi iswarya2812 ,
Please check and try if the below code helps.
a!localVariables( local!excelRawData: index( readexcelimportfile( ri!docId, 0, 0, /*For now given as 30 which is maximum. But we have less than 30 rows*/ 30 ), "result", null ), local!headerRowValuesTemp: a!flatten( index( index(local!excelRawData, 1, null), "values", null ) ), local!headerRowValues: reject( rule!CSCM_CheckIsNullOrEmpty, { local!headerRowValuesTemp } ), /*To find how many columns are present*/ local!noOfHeaderValues: length({ local!headerRowValues }), local!excelDataRowsTemp: index(local!excelRawData, "values", null), /*remove Headers*/ local!excelDataRows: touniformstring( if( length({ local!excelDataRowsTemp }) > 0, remove(local!excelDataRowsTemp, 1), null ) ), local!indicesForHeaders: a!forEach( items: enumerate(local!noOfHeaderValues) + 1, expression: "attribute" & fv!index ), local!constructDataForHeaders: a!update( /*Instead of map you can give your CDT or record*/ data: a!map(), index: { local!indicesForHeaders }, value: { local!headerRowValues } ), local!indicesForValues: a!forEach( items: enumerate(local!noOfHeaderValues) + 1, expression: "value" & fv!index ), local!constructDataForValues: a!update( /*Instead of map you can give your CDT or record*/ data: a!map(), index: { local!indicesForValues }, value: { index( local!excelDataRows, enumerate(local!noOfHeaderValues) + 1, null ) } ), { local!constructDataForHeaders, local!constructDataForValues } )
Hi Shanmathi Ponnusamy
I tried the code but its not working the way I expected .
My excel struture is that first 7 columns will have some details header like name, email id, employee id after that this attriubute and reason column will start it will be till max 20 for example headers will be like (understanding of appian, process models, etc.),and Reason and last column will be detailed feedback in the excel.
In the data row for each attribute header i want to give score and for each reason header need to give reasons for the score provided. my cdt structure is contains feild of same name,email,attribute1,score1,reason1 like till 20 , i want to map them accordingly while the attribute name and number of attribute can change.
Could you please share the excel file with sample data and share your expected result?
One question, You mentioned that you want to give score and reason. How do you give that any criteria?
This is the structure of the excel . I could find how to upload as excel. Here the understanding of maeven setup is attribute for that i want to give score and reason why we give the score. its out of 5 . so the attributes will vary based on technologies here we have adobe ,if we take appian the attribute will change. and number of attributes will also change.
iswarya2812 ,
Just want to be clear on few things.
1)Is the first 6 columns always static? Or for the static columns you have any fixed lables?
2)So all the other headers and those values will be from excel which will be dynamic, and you need to just read and save to your table to use?
the headers are fixed for first 6 but the values for them are dynamic. we are updating data of multiple trainees.
from 7 the header names changes depending on technology and yes I need to read and save these into table.
Okay. You can use the below code to get started. In the below I removed First 6 columns and returned Headers and values. You can index and construct your data in Record or CDT.
a!localVariables( local!excelRawData: index( readexcelimportfile( ri!docId, 0, 0, /*For now given as 30 which is maximum. But we have less than 30 rows*/ 30 ), "result", null ), local!headerRowValuesTemp: a!flatten( index( index(local!excelRawData, 1, null), "values", null ) ), local!fixedHeadersCount: 6, local!headerRowValues: reject( rule!CSCM_CheckIsNullOrEmpty, { if( length({ local!headerRowValuesTemp }) >= local!fixedHeadersCount, remove( local!headerRowValuesTemp, enumerate(local!fixedHeadersCount) + 1 ), local!headerRowValuesTemp ) } ), /*To find how many columns are present*/ local!noOfHeaderValues: length({ local!headerRowValues }), local!excelDataRowsTemp: index(local!excelRawData, "values", null), /*remove Headers*/ local!excelDataRows: if( length({ local!excelDataRowsTemp }) > 0, remove(local!excelDataRowsTemp, 1), null ), local!indicesForHeaders: a!forEach( items: enumerate(local!noOfHeaderValues) + 1, expression: "attribute" & fv!index ), local!constructDataForHeaders: a!update( /*Instead of map you can give your CDT or record*/ data: a!map(), index: { local!indicesForHeaders }, value: { local!headerRowValues } ), local!indicesForValues: a!forEach( items: enumerate(local!noOfHeaderValues) + 1, expression: "value" & fv!index ), local!constructDataForValues: a!flatten( a!forEach( items: local!excelDataRows, expression: a!localVariables( local!currentRowValues: { if( length({ fv!item }) >= local!fixedHeadersCount, remove( fv!item, enumerate(local!fixedHeadersCount) + 1 ), null ) }, if( rule!CSCM_CheckIsNullOrEmpty(value: local!currentRowValues), null, a!update( /*Instead of map you can give your CDT or record*/ data: a!map(), index: { local!indicesForValues }, value: { index( local!currentRowValues, enumerate(local!noOfHeaderValues) + 1, null ) } ) ) ) ) ), { local!constructDataForHeaders, local!constructDataForValues } )
Thanks for the code, I added some modification to get the reasons and scores but I could not get the scores.
a!localVariables( local!excelRawData: index( readexcelimportfile( ri!document, 0, 0, 30 ), "result", null ), local!headerRowValuesTemp: a!flatten( index( index(local!excelRawData, 1, null), "values", null ) ), local!fixedHeadersCount: 6, /* Filter headers to exclude "Reason" columns */ local!headerRowValues: reject( rule!NGT_CheckIsNullOrEmpty, reject( fn!contains(_, "Reason"), if( length({ local!headerRowValuesTemp }) >= local!fixedHeadersCount, remove( local!headerRowValuesTemp, enumerate(local!fixedHeadersCount) + 1 ), local!headerRowValuesTemp ) ) ), /* Filter only "Reason" headers */ local!reasonHeaders: index( local!headerRowValuesTemp, wherecontains("Reason", local!headerRowValuesTemp), {} ), /* Calculate count of valid non-"Reason" headers */ local!noOfHeaderValues: length({ local!headerRowValues }), local!excelDataRowsTemp: index(local!excelRawData, "values", null), /* Remove headers from data rows */ local!excelDataRows: if( length({ local!excelDataRowsTemp }) > 0, remove(local!excelDataRowsTemp, 1), null ), /* Indices for headers excluding "Reason" columns */ local!indicesForHeaders: a!forEach( items: enumerate(local!noOfHeaderValues) + 1, expression: "attribute" & fv!index ), local!constructDataForHeaders: a!update( data: 'type!{urn:com:appian:types:NGT}NGT_UPLD_STG_FEEDBACK_EVALUATION'(), index: { local!indicesForHeaders }, value: { local!headerRowValues } ), /* Dynamically create indices for score values based on non-"Reason" headers */ local!indicesForValues: a!forEach( items: local!headerRowValues, expression: "score" & fv!index ), local!constructDataForValues: a!flatten( a!forEach( items: local!excelDataRows, expression: a!localVariables( /* Filter out "Reason" columns in the current row */ local!currentRowValues: reject( fn!contains(_, "Reason"), if( length({ fv!item }) >= local!fixedHeadersCount, remove( fv!item, enumerate(local!fixedHeadersCount) + 1 ), null ) ), if( rule!NGT_CheckIsNullOrEmpty(inputValue: local!currentRowValues), null, a!update( data: 'type!{urn:com:appian:types:NGT}NGT_UPLD_STG_FEEDBACK_EVALUATION'(), index: { local!indicesForValues }, value: { index( local!currentRowValues, enumerate(local!noOfHeaderValues) + 1, null ) } ) ) ) ) ), /* Process "Reason" columns and map them to reason attributes */ local!indicesForReasons: a!forEach( items: local!reasonHeaders, expression: "reason" & fv!index ), local!constructDataForReasons: a!flatten( a!forEach( items: local!excelDataRows, expression: a!localVariables( local!currentReasonValues: index( fv!item, wherecontains("Reason", local!headerRowValuesTemp), null ), if( rule!NGT_CheckIsNullOrEmpty(inputValue: local!currentReasonValues), null, a!update( data: 'type!{urn:com:appian:types:NGT}NGT_UPLD_STG_FEEDBACK_EVALUATION'(), index: { local!indicesForReasons }, value: { local!currentReasonValues } ) ) ) ) ), { local!constructDataForHeaders, local!constructDataForValues, local!constructDataForReasons } )