XLSXを読み込む
説明
エクセルファイル(.xlsx)を読み込んでArchicadに取り込む方法を紹介します。
プロジェクトに必要なインクルードディレクトリとライブラリを追加する
追加インクルードディレクトリ
- Support\Modules\GSXML
 
- Support\Modules\GSXMLUtils
 
- Support\Modules\LibXL
 
追加ライブラリ
- Support\Modules\LibXL\Win\LibXLImp.LIB
 
 
#include	"LibXL/libxl.h"
#include	"DGModule.hpp"
#include	"xercesc/dom/DOM.hpp"
#include	"GSXMLDOMUtilsEx.hpp"
#define UNISTR_TO_LIBXLSTR(str) ((str).ToUStr ())
#define LIBXLSTR_TO_UNISTR(str) (GS::UniString (str))
GSErrCode ReadXLSX()
{
	GSErrCode err = NoError;
	
	FTM::FileTypeManager xmlTypeManager("xlsx");
	FTM::FileType fileType("xlsx", "xlsx", 0, 0, 0);
	FTM::TypeID typeID = xmlTypeManager.AddType(fileType);
	
	DG::FileDialog dlg(DG::FileDialog::OpenFile);
	dlg.EnablePreview();
	dlg.AddFilter(typeID);
	
	bool bRet = dlg.Invoke();
	xmlTypeManager.RemoveType(typeID);
	if (!bRet)
		return APIERR_CANCEL;
	
	libxl::Book* book = nullptr;
	IO::Location fileLoc = dlg.GetSelectedFile();
	book = xlCreateXMLBook();
#ifdef macintosh
	book->setLocale("UTF-8");
#endif
	GS::UniString path;
	fileLoc.ToPath(&path);
	bRet = book->load(UNISTR_TO_LIBXLSTR(path));
	if (!bRet) {
		book->release();
	}
	if (book == nullptr) {
		return GS::ErrRead;
	}
	if (DBVERIFY(book->sheetCount() > 0))
	{
		Int32 nameInd = -1;
		Int32 typeInd = -1;
		Int32 sizeInd = -1;
		
		libxl::Sheet* sheet = book->getSheet(0);
		for (Int32 i = sheet->firstCol(); i < sheet->lastCol(); i++) {
			if (sheet->cellType(sheet->firstRow(), i) == libxl::CELLTYPE_STRING)
			{
				GS::UniString str = LIBXLSTR_TO_UNISTR(sheet->readStr(sheet->firstRow(), i));
				if (str == "Name")
					nameInd = i;
				else if (str == "Type")
					typeInd = i;
				else if (str == "Size")
					sizeInd = i;
			}
		}
		
		if (nameInd != sheet->firstCol() || typeInd != nameInd+1 || sizeInd != nameInd+2) {
			book->release();
			return APIERR_CANCEL;
		}
		struct XLSXData
		{
			XLSXData() :name(""), type(0), size(0.0) {}
			GS::UniString name;
			int type;
			double size;
		};
		
		for (Int32 j = sheet->firstRow() + 1; j < sheet->lastRow(); j++)
		{
			XLSXData data;
			
			if (sheet->cellType(j, nameInd) == libxl::CELLTYPE_STRING){
				data.name = sheet->readStr(j, nameInd);
			}
			
			if (sheet->cellType(j, typeInd) == libxl::CELLTYPE_NUMBER ) {
				data.type = (int)sheet->readNum(j, typeInd);
			}
			
			if (sheet->cellType(j, sizeInd) == libxl::CELLTYPE_NUMBER) {
				data.size = sheet->readNum(j, sizeInd);
			}
			ACAPI_WriteReport("{%s, %d, %lf}", false, data.name.ToCStr().Get(), data.type, data.size);
		}
	}
	book->release();
	ACAPI_WriteReport("completed", true);
	return err;
}
 
        
     
    
XLSXを読み込む
説明
エクセルファイル(.xlsx)を読み込んでArchicadに取り込む方法を紹介します。
プロジェクトに必要なインクルードディレクトリとライブラリを追加する
追加インクルードディレクトリ
追加ライブラリ