📄 fileimport.c
字号:
/*------------------------------------------------------------------------------*
* File Name: *
* Creation: *
* Purpose: OriginC Source C file *
* Copyright (c) ABCD Corp. 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 *
* All Rights Reserved *
* *
* Modification Log: *
* EJP 07-07-2003 v7.0619 QA70-4783 POST_IMPORT_EXECUTE *
* EJP 07-28-2003 v7.0637 QA70-4911 IMPROVE_HDR_VAR_SCAN *
* EJP 07-29-2003 v7.0637 QA70-4898 PREPARE_WKS_FOR_IMPORT_NEED_USE_CORRECT_NUM_COLUMNS
* EJP 08-07-2003 v7.0648 QA70-4934 FIX_COL_DESIGNATIONS_AND_FORMATS_SET *
* EJP 08-08-2003 v7.0650 QA70-4073.53 USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
* EJP 08-12-2003 v7.0656 QA70-4808 IMPORT_INTO_LOCKED_COL_WARNING *
* EJP 08-12-2003 v7.0657 HIDE_DATA_WINDOW_ON_IMPORT_INTO_GRAPH *
* EJP 08-29-2003 v7.5680 IMPROVE_IMPORT_SPEED_OF_MANY_COLS *
* EJP 09-15-2003 v7.5695 QA70-5135.19 AVOID_UNWANTED_REPEATING_OF_LAST_COL_DESIG_AND_FORMAT
* EJP 09-22-2003 v7.5701 QA70-4818 SAVE_FILTER_IN_WKS *
* EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR *
* EJP 09-26-2003 v7.5707 QA70-5239 IMPORT_INTO_TEXTNUMERIC_COLUMNS *
* EJP 11-12-2003 v7.5753 QA70-5211.11 FIX_SETTING_OF_DESIG_AND_FORMAT *
* EJP 11-24-2003 v7.5769 QA70-5417.18 FIX_DESIG_AND_FMT *
*------------------------------------------------------------------------------*/
////////////////////////////////////////////////////////////////////////////////////
// you can include just this typical header file for most Origin built-in functions and classes
// and it takes a reasonable amount of time to compile,
#include <origin.h>
#include "FileImport.h"
#include "App_Utils.h"
#include "binimp.h"
#include "wks_utils.h"
#include "Filter_Utils.h"
bool iwGetFilter(LPCSTR lpcszDataFile, string &strFilterFile, TreeNode &trFilter);
#define PAGEINFO_IMPORTHEADER "ImportHeader"
////////////////////////////////////////////////////////////////////////////////////
static string s_strFilter; // filter file name
static string s_strGraphPage; // name of target graph page
/// EJP 08-08-2003 v7.0650 QA70-4073.53 USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
static Tree s_trFilter; // filter settings
/// end USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
////////////////////////////////////////////////////////////////////////////////////
// start your functions here
BOOL HandleDataFile()
{
string strWinName;
int nLayer;
int nFile;
int nNumFiles;
string strFileName;
Project.GetDragDropInfo(strWinName, nLayer, nFile, nNumFiles, strFileName);
if( 0 == nFile )
{
s_strFilter.Empty();
s_strGraphPage.Empty();
/// EJP 08-08-2003 v7.0650 QA70-4073.53 USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
s_trFilter.Reset();
/// end USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
}
/// EJP 08-08-2003 v7.0650 QA70-4073.53 USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
/*
if( s_strFilter.IsEmpty() )
{
if( 1 != fuGetFilterFile(s_strFilter, strFileName) )
return false;
}
Page pgData(strWinName);
if( ImportFile(pgData, s_strFilter, strFileName, nFile) )
return false;
Tree trFilter;
if( !trFilter.Load(s_strFilter) )
return false;
GraphPage grpg;
grpg = GetTargetGraphPage(trFilter, strWinName, nLayer);
if( grpg )
{
int nPlotID = fuGetPlotID(trFilter);
GraphData(grpg, nLayer, nPlotID, pgData);
}
*/
if( !fuIsApplicable(s_trFilter, strFileName) && !fuIsApplicable(s_strFilter, strFileName) )
{
/// EJP 09-22-2003 v7.5701 QA70-4818 SAVE_FILTER_IN_WKS
Page pgTarget(strWinName);
int iFilterType;
bool bFilterInPage = false;
if( fuIsOneFilterInPage(pgTarget, strFileName, iFilterType) )
bFilterInPage = fuLoadFilterFromPage(s_trFilter, pgTarget, iFilterType);
if( !bFilterInPage )
{
/// end SAVE_FILTER_IN_WKS
if( 1 != fuGetFilterFile(s_strFilter, strFileName) )
{
if( !iwGetFilter(strFileName, s_strFilter, s_trFilter) )
return FALSE;
}
/// EJP 09-22-2003 v7.5701 QA70-4818 SAVE_FILTER_IN_WKS
}
/// end SAVE_FILTER_IN_WKS
}
int iErr; /// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
Page pgData(strWinName);
if( s_strFilter.IsEmpty() )
{
/// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
///if( ImportFile(pgData, s_trFilter, strFileName, nFile) )
/// return false;
iErr = ImportFile(pgData, s_trFilter, strFileName, nFile);
/// end NOTIFY_USER_OF_IMPORT_ERROR
}
else
{
/// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
///if( ImportFile(pgData, s_strFilter, strFileName, nFile) )
/// return false;
///if( !s_trFilter.Load(s_strFilter) )
/// return false;
iErr = ImportFile(pgData, s_strFilter, strFileName, nFile);
if( IMPERR_NONE == iErr )
{
if( !s_trFilter.Load(s_strFilter) )
iErr = IMPERR_LOAD_FILTER;
}
/// end NOTIFY_USER_OF_IMPORT_ERROR
}
/// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
if( IMPERR_NONE != iErr )
{
ImportErrorMsgBox(iErr, s_strFilter);
return false;
}
/// end NOTIFY_USER_OF_IMPORT_ERROR
GraphPage grpg;
grpg = GetTargetGraphPage(s_trFilter, strWinName, nLayer);
if( grpg )
{
int nPlotID = fuGetPlotID(s_trFilter);
GraphData(grpg, nLayer, nPlotID, pgData);
}
/// end USE_SAME_FILTER_FOR_MULTI_FILES_ON_FILEOPEN_AND_DRAGDROP
return true;
}
int ImportFile(Page &pgTarget, LPCSTR lpcszFilter, LPCSTR lpcszFile, int nFile)
{
if( NULL == lpcszFilter )
return IMPERR_NO_FILTER; // no filter
Tree trFilter;
if( !trFilter.Load(lpcszFilter) )
return IMPERR_LOAD_FILTER; // load filter error
/// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
///if( ImportFile(pgTarget, trFilter, lpcszFile, nFile) )
/// return 1; // import error
int iErr = ImportFile(pgTarget, trFilter, lpcszFile, nFile);
if( IMPERR_NONE != iErr )
return iErr;
/// end NOTIFY_USER_OF_IMPORT_ERROR
if( pgTarget )
pgTarget.Info.System.Import.Filter$ = lpcszFilter;
return IMPERR_NONE; // success
}
int ImportFile(Page &pgTarget, TreeNode &trFilter, LPCSTR lpcszFile, int nFile)
{
int iFilterType = fuGetFilterType(trFilter);
// Get the target data page.
pgTarget = GetTargetDataPage(trFilter, pgTarget, nFile);
if( !pgTarget && FILTER_TYPE_USERDEFINED != iFilterType )
return IMPERR_NO_TARGET_PAGE; // no target page
// If target page is a wks then setup the columns.
string strColDesig, strColFormat;
if( pgTarget && EXIST_WKS == pgTarget.GetType() )
{
/// EJP 09-24-2003 v7.5706 QA70-5230 NOTIFY_USER_OF_IMPORT_ERROR
/// /// EJP 08-12-2003 v7.0656 QA70-4808 IMPORT_INTO_LOCKED_COL_WARNING
/// ///PrepareWksColsForImport(pgTarget, trFilter, lpcszFile);
/// if( PrepareWksColsForImport(pgTarget, trFilter, lpcszFile) )
/// return 1;
/// /// end IMPORT_INTO_LOCKED_COL_WARNING
int iErr = PrepareWksColsForImport(pgTarget, trFilter, lpcszFile);
if( IMPERR_NONE != iErr )
return iErr;
/// end NOTIFY_USER_OF_IMPORT_ERROR
Worksheet wks(pgTarget.GetName());
if( wks )
{
strColDesig = wks.GetColDesignations();
strColFormat = wks.GetColFormats();
}
/// EJP 11-24-2003 v7.5769 QA70-5417.18 FIX_DESIG_AND_FMT
/// /// EJP 09-26-2003 v7.5707 QA70-5239 IMPORT_INTO_TEXTNUMERIC_COLUMNS
/// // Importing into Text columns (and maybe others) will fail.
/// // Instead we import into Text&Numeric and set user specified format afterwards.
/// wks.SetColFormats("9", true); // temporary set all cols to Text&Numeric
/// /// end IMPORT_INTO_TEXTNUMERIC_COLUMNS
/// end FIX_DESIG_AND_FMT
}
// Get pointer to import function.
PFNIMPORTFUNC pfn = fuGetImportFunctionPtr(trFilter);
if( !pfn )
return IMPERR_GET_IMPORT_FUNC; // no import function
// Call import function.
if( pfn(pgTarget, trFilter, lpcszFile, nFile) )
return IMPERR_IMPORT_FUNC_ERR; // import function error
if( pgTarget && EXIST_WKS == pgTarget.GetType() && FILTER_TYPE_USERDEFINED != iFilterType )
{
Worksheet wks(pgTarget.GetName());
if( wks )
{
wks.SetColDesignations(strColDesig, false);
wks.SetColFormats(strColFormat, false);
}
}
// Check if not ASCII type because the intenal ASCII import code
// will handle renaming the wks.
if( FILTER_TYPE_ASCII != iFilterType && fuIsRenameWks(trFilter) )
{
string strNewName = GetFileName(lpcszFile, TRUE);
if( !strNewName.IsEmpty() )
pgTarget.Rename(strNewName);
}
if( pgTarget && fuIsFileNameToWksLabel(trFilter) )
{
pgTarget.Label = GetFileName(lpcszFile);
pgTarget.TitleShow = WIN_TITLE_SHOW_BOTH;
}
// If data file has header parameters then add them to page info.
if( pgTarget && fuGetHeaderParamCount(trFilter) )
HeaderVariablesToPageInfo(pgTarget, trFilter, lpcszFile);
/// EJP 07-10-2003 v7.0622 QA70-4745 SET_PAGE_IMPORT_INFO_ON_123_ASC_IMPORT
/*
// Set page import info.
/// EJP 06-30-2003 v7.0613 QA70-4745 ADD_SYSTEM_IMPORT_FILEDATE
double dJulianDate = 0.0;
WIN32_FILE_ATTRIBUTE_DATA fad;
if( GetFileAttributesEx(lpcszFile, 0, &fad) )
{
SYSTEMTIME st;
if( FileTimeToSystemTime(&fad.ftLastWriteTime, &st) )
SystemTimeToJulianDate(&dJulianDate, &st);
}
pgTarget.Info.System.Import.FileDate = dJulianDate;
/// end ADD_SYSTEM_IMPORT_FILEDATE
pgTarget.Info.System.Import.FileName$ = GetFileName(lpcszFile);
pgTarget.Info.System.Import.FilePath$ = lpcszFile;
pgTarget.Info.System.Import.Filter$ = ""; // filter file unknown
pgTarget.Info.System.Import.FileType = trFilter.Type.nVal;
*/
set_page_import_info(pgTarget, lpcszFile, iFilterType);
/// end SET_PAGE_IMPORT_INFO_ON_123_ASC_IMPORT
// Save any requested header lines.
if( FILTER_TYPE_ASCII == iFilterType )
{
int iFirstLine, iNumLines;
fuGetHdrSave(trFilter, iFirstLine, iNumLines);
if( iNumLines )
{
string strHdrLines;
if( 0 == LoadTextFile(strHdrLines, lpcszFile, iNumLines, iFirstLine) )
{
vector<byte> vb;
if( strHdrLines.GetBytes(vb) )
pgTarget.SetMemory(PAGEINFO_IMPORTHEADER, vb);
}
}
}
/// EJP 07-07-2003 v7.0619 QA70-4783 POST_IMPORT_EXECUTE
if( fuGetPostImportScript(trFilter, strColDesig) && !strColDesig.IsEmpty() )
{
if( pgTarget )
{
Layer lay = pgTarget.Layers();
if( lay )
lay.LT_execute(strColDesig);
}
}
/// end POST_IMPORT_EXECUTE
return IMPERR_NONE; // success
}
//--------------------------------------------------------------------------
// GetTargetDataPage
//
// Determine the target page for the data by using the filter and window
// name and layer (if drag-drop on a window).
// This function may return the page specified in the window name argument
// but that is not guranteed. It depends on the filter settings.
//--------------------------------------------------------------------------
static Page GetTargetDataPage(TreeNode &trFilter, Page &pgTarget, int nFile)
{
if( pgTarget && fuIsTargetPageType(trFilter, pgTarget.GetType()) )
{
if( 0 == nFile || ASCIMP_MODE_REPLACE_DATA != fuGetImportMode(trFilter) || IsPageEmpty(pgTarget) )
return pgTarget; // use current page
}
/// EJP 08-12-2003 v7.0657 HIDE_DATA_WINDOW_ON_IMPORT_INTO_GRAPH
///return fuCreateTargetPage(trFilter); // create a new page
int iOption = CREATE_VISIBLE;
if( pgTarget && EXIST_PLOT == pgTarget.GetType() )
iOption = CREATE_HIDDEN;
return fuCreateTargetPage(trFilter, iOption); // create a new page
/// end HIDE_DATA_WINDOW_ON_IMPORT_INTO_GRAPH
}
static BOOL IsPageEmpty(Page &pg)
{
string str = pg.GetName();
if( EXIST_WKS == pg.GetType() )
{
WorksheetPage wkspg(str);
if( wkspg )
{
Worksheet wks(str);
if( wks )
{
int r1, r2;
wks.GetRange(r1, r2, 0, -1, false);
if( r2 == -1 ) // if wks is empty
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -