搞定车商方案表读取。
This commit is contained in:
parent
57194b10ea
commit
413c6c2f29
@ -21,7 +21,9 @@
|
||||
<ClCompile Include="..\..\..\source\Data\DataManipulation\Excel\LoadFromExcel.cpp" />
|
||||
<ClCompile Include="..\..\..\source\Data\Datastructure\CarDealerAchievement\CarDealerAchievement.cpp" />
|
||||
<ClCompile Include="..\..\..\source\Data\Datastructure\CarDealerScheme\CarDealerScheme.cpp" />
|
||||
<ClCompile Include="..\..\..\source\data\excel\excel.cpp" />
|
||||
<ClCompile Include="..\..\..\source\main.cpp" />
|
||||
<ClCompile Include="..\..\..\source\test\test.cpp" />
|
||||
<ClCompile Include="..\..\..\source\Widgets\MainFrame\QMainFrame.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -38,6 +40,8 @@
|
||||
<ClInclude Include="..\..\..\source\Data\DataManipulation\Excel\LoadFromExcel.h" />
|
||||
<ClInclude Include="..\..\..\source\Data\Datastructure\CarDealerAchievement\CarDealerAchievement.h" />
|
||||
<ClInclude Include="..\..\..\source\Data\Datastructure\CarDealerScheme\CarDealerScheme.h" />
|
||||
<ClInclude Include="..\..\..\source\data\excel\excel.h" />
|
||||
<ClInclude Include="..\..\..\source\test\test.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{B12702AD-ABFB-343A-A199-8E24837244A3}</ProjectGuid>
|
||||
|
@ -50,6 +50,12 @@
|
||||
<Filter Include="数据\数据管理\excel">
|
||||
<UniqueIdentifier>{849ef05c-ca3c-479b-ad38-3b9eae188820}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="测试">
|
||||
<UniqueIdentifier>{c6a0a5fd-26f9-4d8d-84a5-ce7edb04eb5f}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="excel">
|
||||
<UniqueIdentifier>{61d5dd61-6b1f-4507-bb22-4ce463ad5b85}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\source\main.cpp">
|
||||
@ -70,6 +76,12 @@
|
||||
<ClCompile Include="..\..\..\source\Data\DataManipulation\Excel\LoadFromExcel.cpp">
|
||||
<Filter>数据\数据管理\excel</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\test\test.cpp">
|
||||
<Filter>测试</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\data\excel\excel.cpp">
|
||||
<Filter>excel</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtRcc Include="..\..\..\source\resource.qrc">
|
||||
@ -109,5 +121,11 @@
|
||||
<ClInclude Include="..\..\..\source\Data\DataManipulation\Excel\LoadFromExcel.h">
|
||||
<Filter>数据\数据管理\excel</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\test\test.h">
|
||||
<Filter>测试</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\data\excel\excel.h">
|
||||
<Filter>excel</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,20 +1,11 @@
|
||||
#include <libxl.h>
|
||||
#include <exception>
|
||||
#include "LoadFromExcel.h"
|
||||
#include <stdexcept>
|
||||
#include "LoadFromExcel.h"
|
||||
#include "../../excel/excel.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace libxl;
|
||||
|
||||
void SetKey( Book * pBook )
|
||||
{
|
||||
if ( pBook == nullptr )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pBook->setKey( L"cpic", L"windows-202d21040bc4e70060bc6264a6ucu7i1" );
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* \brief 从Excel文件读取车商方案表
|
||||
@ -23,8 +14,8 @@ void SetKey( Book * pBook )
|
||||
************************************************/
|
||||
void LoadCarDealerSchemeFromXlsx( const wstring & filePath,
|
||||
unsigned int sheetIndex,
|
||||
unsigned int firstRowIndex,
|
||||
map<wstring, CarDealerScheme> & schemeMap )
|
||||
unsigned int startRowIndex,
|
||||
vector<CarDealerScheme> & schemeVector )
|
||||
{
|
||||
Book * pBook = xlCreateXMLBookW();
|
||||
Sheet * pSheet = nullptr;
|
||||
@ -34,7 +25,7 @@ void LoadCarDealerSchemeFromXlsx( const wstring & filePath,
|
||||
throw runtime_error( "libxl库加载失败!" );
|
||||
}
|
||||
|
||||
SetKey( pBook );
|
||||
setKey( pBook );
|
||||
|
||||
if ( pBook->load( filePath.c_str() ) != true )
|
||||
{
|
||||
@ -51,8 +42,43 @@ void LoadCarDealerSchemeFromXlsx( const wstring & filePath,
|
||||
string errorMessage = "读取sheet失败!";
|
||||
errorMessage.append( pBook->errorMessage() );
|
||||
|
||||
pBook->release();
|
||||
|
||||
throw runtime_error( errorMessage );
|
||||
}
|
||||
|
||||
int lastRowIndex = pSheet->lastRow();
|
||||
int firstRowIndex = pSheet->firstRow();
|
||||
int firstColumnIndex = pSheet->firstCol();
|
||||
int rowIndex = firstRowIndex + startRowIndex;
|
||||
|
||||
while ( rowIndex <= lastRowIndex )
|
||||
{
|
||||
int colunmIndex = firstRowIndex;
|
||||
|
||||
const wstring && theYear = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex, true );
|
||||
const wstring && theMonth = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 1, true );
|
||||
const wstring && carDealerCode = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 2, true );
|
||||
const wstring && carDealerName = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 3, true );
|
||||
const wstring && manHourPrice = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 4, true );
|
||||
const wstring && partPrice = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 5, true );
|
||||
const wstring && claimSupport = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 6, true );
|
||||
const wstring && scheme = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 7, true );
|
||||
const wstring && isQualified = ReadCellStringFromXlsx( pBook, sheetIndex, rowIndex, colunmIndex + 8, true );
|
||||
|
||||
CarDealerScheme carDealerScheme( theYear,
|
||||
theMonth,
|
||||
carDealerCode,
|
||||
manHourPrice,
|
||||
partPrice,
|
||||
claimSupport,
|
||||
scheme,
|
||||
isQualified );
|
||||
|
||||
schemeVector.push_back( carDealerScheme );
|
||||
|
||||
rowIndex++;
|
||||
}
|
||||
|
||||
pBook->release();
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
|
||||
#pragma once
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "../../Datastructure/CarDealerScheme/CarDealerScheme.h"
|
||||
#include "../../Datastructure/CarDealerAchievement/CarDealerAchievement.h"
|
||||
|
||||
|
||||
void LoadCarDealerSchemeFromXlsx( const std::wstring & filePath,
|
||||
unsigned int sheetIndex,
|
||||
unsigned int startRowIndex,
|
||||
std::vector<CarDealerScheme> & schemeVector );
|
||||
|
@ -59,14 +59,14 @@ public:
|
||||
}
|
||||
|
||||
CarDealerScheme( CarDealerScheme && other )
|
||||
: theYear( std::move(other.theYear) ),
|
||||
theMonth( std::move(other.theMonth) ),
|
||||
carDealerCode( std::move(other.carDealerCode) ),
|
||||
manHourPrice( std::move(other.manHourPrice) ),
|
||||
partPrice( std::move(other.partPrice) ),
|
||||
claimSupport( std::move(other.claimSupport) ),
|
||||
scheme( std::move(other.scheme) ),
|
||||
isQualified( std::move(other.isQualified) )
|
||||
: theYear( std::move( other.theYear ) ),
|
||||
theMonth( std::move( other.theMonth ) ),
|
||||
carDealerCode( std::move( other.carDealerCode ) ),
|
||||
manHourPrice( std::move( other.manHourPrice ) ),
|
||||
partPrice( std::move( other.partPrice ) ),
|
||||
claimSupport( std::move( other.claimSupport ) ),
|
||||
scheme( std::move( other.scheme ) ),
|
||||
isQualified( std::move( other.isQualified ) )
|
||||
{
|
||||
}
|
||||
|
||||
|
157
代码/cpp/car_dealer_util/source/data/excel/excel.cpp
Normal file
157
代码/cpp/car_dealer_util/source/data/excel/excel.cpp
Normal file
@ -0,0 +1,157 @@
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include <stdexcept>
|
||||
#include "excel.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace libxl;
|
||||
|
||||
void setKey( libxl::Book * pBook )
|
||||
{
|
||||
if ( pBook != nullptr )
|
||||
{
|
||||
pBook->setKey( L"cpic", L"windows-202d21040bc4e70060bc6264a6ucu7i1" );
|
||||
}
|
||||
}
|
||||
|
||||
std::wstring ReadCellStringFromXlsx( libxl::IBookT<wchar_t> * pBook,
|
||||
unsigned int sheetIndex,
|
||||
unsigned int rowIndex,
|
||||
unsigned int colIndex,
|
||||
bool isInteger )
|
||||
{
|
||||
using namespace libxl;
|
||||
|
||||
std::wstring returnValue;
|
||||
|
||||
int year = 0;
|
||||
int month = 0;
|
||||
int day = 0;
|
||||
int hour = 0;
|
||||
int min = 0;
|
||||
int second = 0;
|
||||
|
||||
//验证
|
||||
if ( pBook == nullptr )
|
||||
{
|
||||
throw std::logic_error( "ReadCellStringFromXlsx pSheet参数错误!" );
|
||||
}
|
||||
|
||||
ISheetT<wchar_t> * pSheet = pBook->getSheet( sheetIndex );
|
||||
CellType cellType = pSheet->cellType( rowIndex, colIndex );
|
||||
|
||||
//判断单元格类型
|
||||
switch ( cellType )
|
||||
{
|
||||
case CellType::CELLTYPE_BOOLEAN: //bool类型
|
||||
{
|
||||
returnValue = pSheet->readBool( rowIndex, colIndex ) ? L"true" : L"false";
|
||||
|
||||
break;
|
||||
}
|
||||
case CellType::CELLTYPE_NUMBER: //数字类型,还得再判断一下是不是日期类型
|
||||
{
|
||||
double cellValue = pSheet->readNum( rowIndex, colIndex );
|
||||
wchar_t buffer[50]; //生成字符串的缓冲区
|
||||
|
||||
if ( pSheet->isDate( rowIndex, colIndex ) == true )
|
||||
{
|
||||
//是日期类型
|
||||
if ( pBook->dateUnpack( cellValue,
|
||||
&year,
|
||||
&month,
|
||||
&day,
|
||||
&hour,
|
||||
&min,
|
||||
&second ) == false )
|
||||
{
|
||||
throw std::runtime_error( "转换日期格式失败!" );
|
||||
}
|
||||
|
||||
//排除bug
|
||||
if ( min >= 60 )
|
||||
{
|
||||
hour = hour + 1;
|
||||
min = min - 60;
|
||||
}
|
||||
|
||||
// if ( hour >= 24 )
|
||||
// {
|
||||
// day = day + 1;
|
||||
// hour = hour - 24;
|
||||
// }
|
||||
//
|
||||
// switch ( month )
|
||||
// {
|
||||
// case 1:
|
||||
// case 3:
|
||||
// case
|
||||
// }
|
||||
|
||||
wsprintfW( buffer, L"%d-%.2d-%.2d %.2d:%.2d:%.2d", year, month, day, hour, min, second );
|
||||
}
|
||||
else
|
||||
{
|
||||
//是数字类型, 根据isInteger参数选择输出整型或者浮点型
|
||||
if ( isInteger == true )
|
||||
{
|
||||
wsprintfW( buffer, L"%d", static_cast<long>(cellValue) );
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintfW( buffer, L"%f", cellValue );
|
||||
}
|
||||
}
|
||||
|
||||
returnValue = buffer;
|
||||
|
||||
break;
|
||||
}
|
||||
case CELLTYPE_STRING: //字符串类型,要先判断一下读取的结果是不是空值
|
||||
{
|
||||
const wchar_t * pValue = pSheet->readStr( rowIndex, colIndex );
|
||||
|
||||
if ( pValue != nullptr )
|
||||
{
|
||||
returnValue = pValue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
libxl::Sheet * getXlsxSheetByName( libxl::IBookT<wchar_t> * pBook, const std::wstring & sheetName )
|
||||
{
|
||||
Sheet * pSheet = nullptr;
|
||||
Sheet * pCurrentSheet = nullptr;
|
||||
|
||||
if ( pBook == nullptr )
|
||||
{
|
||||
throw logic_error( "参数错误!" );
|
||||
}
|
||||
|
||||
int sheetCount = pBook->sheetCount();
|
||||
int sheetIndex = 0;
|
||||
|
||||
while ( sheetIndex < sheetCount )
|
||||
{
|
||||
pCurrentSheet = pBook->getSheet( sheetIndex );
|
||||
|
||||
wstring currentSheetName = pCurrentSheet->name();
|
||||
|
||||
if ( currentSheetName == sheetName )
|
||||
{
|
||||
pSheet = pCurrentSheet;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sheetIndex++;
|
||||
}
|
||||
|
||||
return pSheet;
|
||||
}
|
31
代码/cpp/car_dealer_util/source/data/excel/excel.h
Normal file
31
代码/cpp/car_dealer_util/source/data/excel/excel.h
Normal file
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#ifndef EXCEL_H_
|
||||
#define EXCEL_H_
|
||||
|
||||
#include <libxl.h>
|
||||
|
||||
void setKey( libxl::Book * pBook );
|
||||
|
||||
/************************************************
|
||||
* \brief 从xlsx文件单元格中读取数据,以字符串为返回值。
|
||||
* \param pBook libxl的Book对象。
|
||||
* \param sheetIndex sheet的索引值
|
||||
* \param rowIndex 行号
|
||||
* \param colIndex 列号
|
||||
* \return 返回的字符串
|
||||
************************************************/
|
||||
std::wstring ReadCellStringFromXlsx( libxl::IBookT<wchar_t> * pBook,
|
||||
unsigned int sheetIndex,
|
||||
unsigned int rowIndex,
|
||||
unsigned int colIndex,
|
||||
bool isInteger );
|
||||
|
||||
/************************************************
|
||||
* \brief 通过名称获取sheet
|
||||
* \param sheetName
|
||||
* \return
|
||||
************************************************/
|
||||
libxl::Sheet * getXlsxSheetByName( libxl::IBookT<wchar_t> * pBook, const std::wstring & sheetName );
|
||||
|
||||
|
||||
#endif
|
@ -1,6 +1,7 @@
|
||||
#include <QtWidgets/QtWidgets>
|
||||
#include <QtWidgets/QApplication>
|
||||
#include "Widgets/MainFrame/QMainFrame.h"
|
||||
#include "test/test.h"
|
||||
|
||||
int main( int argc, char * argv[] )
|
||||
{
|
||||
@ -21,6 +22,10 @@ int main( int argc, char * argv[] )
|
||||
return -1;
|
||||
}
|
||||
|
||||
test();
|
||||
|
||||
return 1;
|
||||
|
||||
try
|
||||
{
|
||||
pMainFrame = new QMainFrame();
|
||||
|
24
代码/cpp/car_dealer_util/source/test/test.cpp
Normal file
24
代码/cpp/car_dealer_util/source/test/test.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include "test.h"
|
||||
#include "../data/DataManipulation/Excel/LoadFromExcel.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void excelTest();
|
||||
|
||||
void test()
|
||||
{
|
||||
excelTest();
|
||||
}
|
||||
|
||||
void excelTest()
|
||||
{
|
||||
vector<CarDealerScheme> schemeVector;
|
||||
wstring filePath = L"D:/develop/projects_win/2019/car_dealer_util/数据/PC端导入模板(管理员版).xlsx";
|
||||
|
||||
LoadCarDealerSchemeFromXlsx(filePath, 0, 1, schemeVector);
|
||||
|
||||
return;
|
||||
}
|
4
代码/cpp/car_dealer_util/source/test/test.h
Normal file
4
代码/cpp/car_dealer_util/source/test/test.h
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
void test();
|
Loading…
x
Reference in New Issue
Block a user