Minimum Origin Version Required: Origin 8 SR0
This section introduced access numeric data, text, Julian date/time data from Origin worksheet window.
More related details please reference to the following Origin C Reference sections:
void GetNumericDataset() { Worksheet wks = Project.ActiveLayer(); if( wks ) // if active layer is Worksheet { foreach(Column col in wks.Columns) { vectorbase& vec = col.GetDataObject(); // use vectorbase here since data in column can be any numeric data type, for example, double, int, complex. double dSum; vec.Sum(dSum); printf("The sum of the %dth column is %f\n", col.GetIndex()+1, dSum); // GetIndex return index with 0 offset } } }
void ModifyNumericDataset() { Worksheet wks = Project.ActiveLayer(); if( wks && wks.GetNumCols() >= 2 ) //to make sure active window is Worksheet and at least exist two columns { DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "X"); vector vA, vB; dr.GetData(&vA, 0); dr.GetData(&vB, 1); // sort the whole worksheet by column A with ascending vector<uint> vnIndices; vA.Sort(SORT_ASCENDING, TRUE, vnIndices); // sort column A and returned order indices vB.Reorder(vnIndices); // reorder column B by column A indices dr.SetData(vA, false, 0); dr.SetData(vB, false, 1); } }
void AccessNumericData(int nRow = 0, int nCol = 0) { Worksheet wks = Project.ActiveLayer(); if( !wks ) return; double dd = wks.Cell(nRow, nCol); out_double("The original data is ", dd); dd = 100; wks.SetCell(nRow, nCol, dd); out_double("The modified data is ", dd); }
In order to keep Origin C function more efficient on putting the large dataset to worksheet, for example 5000 columns, need to do like the steps below.
See following example codes:
void PutLargeDataset(int rows = 100, int cols = 500) { // prepare worksheet size Worksheet wks; wks.Create("Origin"); while( wks.DeleteCol(0) ); wks.SetSize(rows, cols); // put dataset to worksheet column one by one foreach(Column col in wks.Columns) { col.SetFormat(OKCOLTYPE_NUMERIC); col.SetInternalData(FSI_SHORT); col.SetUpperBound(rows-1);//index of last row, 0 offset int nElementSize; uint nNum; LPVOID pData = col.GetInternalDataBuffer(&nElementSize, &nNum); short* psBuff = (short*)pData; // OC loop is still slow, but you might pass this pointer to your DLL // for much faster manipulation, here we just show that the pointer works for(int ii = 0; ii < rows; ii++, psBuff++) { *psBuff = (ii+1) * (col.GetIndex()+1); } col.ReleaseBuffer(); // do NOT remember to call this } }
void AccessStringArray() { Worksheet wks = Project.ActiveLayer(); if( wks ) { foreach(Column col in wks.Columns) { int nFormat = col.GetFormat(); if( OKCOLTYPE_TEXT == nFormat || OKCOLTYPE_TEXT_NUMERIC == nFormat ) { vector<string> vstr; col.GetStringArray(vstr); DWORD dwOptions = SORT_ASCENDING | SORT_CASE_SENSITIVE; vstr.Sort(dwOptions); // ascending sort with case sensitive col.PutStringArray(vstr); // put back sorted string array to column } } } }
void AccessString(int nRow = 0, int nCol = 0) { Worksheet wks; wks.Create("Origin"); string strVal; wks.GetCell(nRow, nCol, strVal); out_str(strVal); strVal = "This is an example!"; wks.SetCell(nRow, nCol, strVal); out_str(strVal); Column col = wks.Columns(nCol); col.SetWidth(-1); // -1 to set the width to the largest cell in the column. }
void AccessDateTimeData(int nColIndex) { Worksheet wks = Project.ActiveLayer(); if( !wks ) return; Column col(wks, nColIndex); if( !col ) return; // find out the smallest date if( OKCOLTYPE_DATE == col.GetFormat() || OKCOLTYPE_TIME == col.GetFormat() ) { vector& vec = col.GetDataObject(); // return the Julian date value if( vec.GetSize() != 0 ) { vec.Sort(); printf("The smallest date is %s\n", get_date_str(vec[0], LDF_LONG)); } } }
void fill_with_missing() { Worksheet wks = Project.ActiveLayer(); // get active worksheet if(!wks) { out_str("The active worksheet not exist!"); return; } DataRange dr; dr.Add("X", wks, 0, 0, -1, -1); // the whole worksheet dr.Replace(0, NANUM, WKSREPL_TEST_EQUAL); // replace by missing, missing=NANUM Dataset ds(wks, 0); // dataset attached to column 1 ds = NANUM; // clear column 1 }