该文件中包含自己编写的一个库文件,该库文件支持:
1:CSV文件导出;
原理:
将导出数据换分多个段,每个段支持横排和竖排格式两种以及多条记录;
实例:
1):创建一个导出器对象Util_CSVExporter_Create( );
2):向导出器添加段Util_CSVExporter_AddSegment;
3):如果需要关注进度,则Util_CSVExporter_SetElementHandler设置进度回调;
4):导出数据到文件:Util_CSVExporter_Export;
5):销毁导出器对象:Util_CSVExporter_Destroy;
整个库使用前,调用Util_Init初始化库,使用结束后,调用Util_DeInit反初始化;
2:使用实例
#include <string.h>
#include "util_external.h"
#include "csvexport_test.h"
typedef struct _DATE_CONTENT_HEAD_
{
int8 acYearHead[20];
int8 acMonthHead[20];
int8 acDayHead[20];
} DATE_CONTENT_HEAD;
ubool GetOneDateHeadRecord( void* pvRecBuf, int32 lBufLen, int32 lIndex )
{
DATE_CONTENT_HEAD stDateHead = { "IDS_YEAR", "IDS_MONTH", "IDS_DAY" };
// ????
if ( NULL == pvRecBuf || lBufLen < sizeof(DATE_CONTENT_HEAD) )
{
return FALSE;
}
memcpy( pvRecBuf, &stDateHead, sizeof(DATE_CONTENT_HEAD) );
return TRUE;
}
ubool GetOneDateConentRecord( void* pvRecBuf, int32 lBufLen, int32 lIndex )
{
UTIL_DATE stDateContent = { 2009, 05, 18 };
// ????
if ( NULL == pvRecBuf || lBufLen < sizeof(UTIL_DATE) )
{
return FALSE;
}
memcpy( pvRecBuf, &stDateContent, sizeof(UTIL_DATE) );
return TRUE;
}
void Test_Util_CSVExport( )
{
int32 lExporter = 0;
CSV_RECORD_FIELD astRecordHeadFields[] = {
{ OFFSETOF(DATE_CONTENT_HEAD, acYearHead), Util_FormatStringFieldToString },
{ OFFSETOF(DATE_CONTENT_HEAD, acMonthHead), Util_FormatStringFieldToString },
{ OFFSETOF(DATE_CONTENT_HEAD, acDayHead), Util_FormatStringFieldToString },
};
CSV_RECORD_FIELD astRecordContentFields[] = {
{ OFFSETOF(UTIL_DATE, nYear), Util_FormatInt16FieldToString },
{ OFFSETOF(UTIL_DATE, nMonth), Util_FormatCharFieldToString },
{ OFFSETOF(UTIL_DATE, nDay), Util_FormatCharFieldToString },
};
CSV_SEGMENT_INFO stSegmentInfo;
do
{
lExporter = Util_CSVExporter_Create( );
if ( lExporter < 0 )
{
break;
}
stSegmentInfo.lStartRow = 1;
stSegmentInfo.lStartCol = 1;
stSegmentInfo.lMaxFieldLen = 20;
stSegmentInfo.lMaxRecordLen = sizeof(DATE_CONTENT_HEAD);
stSegmentInfo.lOrientation = ORIENTATION_HORIZOTAL;
stSegmentInfo.lNumOfRecords = 1;
stSegmentInfo.pfnGetOneRecord = GetOneDateHeadRecord;
stSegmentInfo.lNumOfFields = TABLESIZE(astRecordHeadFields);
stSegmentInfo.pstRecordFields = astRecordHeadFields;
if ( !Util_CSVExporter_AddSegment( lExporter, &stSegmentInfo ) )
{
break;
}
stSegmentInfo.lStartRow = 2;
stSegmentInfo.lStartCol = 1;
stSegmentInfo.lMaxRecordLen = sizeof(UTIL_DATE);
stSegmentInfo.lNumOfRecords = 1;
stSegmentInfo.pfnGetOneRecord = GetOneDateConentRecord;
stSegmentInfo.lNumOfFields = TABLESIZE(astRecordContentFields);
stSegmentInfo.pstRecordFields = astRecordContentFields;
if ( !Util_CSVExporter_AddSegment( lExporter, &stSegmentInfo ) )
{
break;
}
stSegmentInfo.lStartRow = 10;
stSegmentInfo.lStartCol = 10;
stSegmentInfo.lMaxFieldLen = 20;
stSegmentInfo.lMaxRecordLen = sizeof(DATE_CONTENT_HEAD);
stSegmentInfo.lOrientation = ORIENTATION_VERTICAL;
stSegmentInfo.lNumOfRecords = 1;
stSegmentInfo.pfnGetOneRecord = GetOneDateHeadRecord;
stSegmentInfo.lNumOfFields = TABLESIZE(astRecordHeadFields);
stSegmentInfo.pstRecordFields = astRecordHeadFields;
if ( !Util_CSVExporter_AddSegment( lExporter, &stSegmentInfo ) )
{
break;
}
stSegmentInfo.lStartRow = 10;
stSegmentInfo.lStartCol = 11;
stSegmentInfo.lMaxRecordLen = sizeof(UTIL_DATE);
stSegmentInfo.lNumOfRecords = 1;
stSegmentInfo.pfnGetOneRecord = GetOneDateConentRecord;
stSegmentInfo.lNumOfFields = TABLESIZE(astRecordContentFields);
stSegmentInfo.pstRecordFields = astRecordContentFields;
if ( !Util_CSVExporter_AddSegment( lExporter, &stSegmentInfo ) )
{
break;
}
if ( !Util_CSVExporter_Export( lExporter, 0, ".//date.csv" ) )
{
break;
}
} while( 0 );
if ( 0 < lExporter )
{
//
Util_CSVExporter_Destroy( lExporter );
}
}