programing

엑셀 파일 작업을 위한 간단하고 신뢰할 수 있는 C 라이브러리는 무엇입니까?

batch 2023. 4. 26. 23:08
반응형

엑셀 파일 작업을 위한 간단하고 신뢰할 수 있는 C 라이브러리는 무엇입니까?

음... 그게 다야.

저는 간단하고 신뢰할 수 있는 것이 필요합니다(멋진 기능을 가질 필요는 없습니다 - 엑셀 셀에서 텍스트와 숫자를 쓰고 읽어야 합니다).

그리고 예, "헬로 셀" 코드 샘플을 원합니다.

무엇을 추천하시겠습니까?

매우 낙담했습니다.XLS 대신 C-friendly 형식(예: CSV)을 사용하거나 새로운 XML 형식(XML 및 ZIP 라이브러리를 선택하십시오)을 사용하는 것이 좋습니다.

그래도 빠른 수정을 위해 따옴표로 묶인 CSV로 내보낸 다음 VBScript를 사용하여 가져올 수 있습니다.와 같은 것입니다. 먼저 VBA에서 작동하도록 시도해 보겠습니다.

이 작업에는 Office 사본이 필요하며 잘 확장되지 않습니다(그러나 Excel 창을 숨길 수 있음).


방금 xlsLib를 찾았으니, 정말로 C로 직접 써야 한다면 해보세요!그러나 특히 기존 파일에 쓰는 경우에는 올바르게 쓰기가 매우 어렵기 때문에 주의해야 합니다.

LibExcel도 존재하지만, 그것은 C++이기 때문에 당신은 포장지를 컴파일하거나 C를 위해 다시 써야 합니다.


마지막으로 주의할 점은, 제가 처음에 이것들을 검색하지 않은 이유는 바로 잡기가 매우 어렵다는 것입니다.위의 도서관을 이용해 본 적은 없지만, 이상하고 특이한 방법으로 고장이 날 것 같습니다.사무실 형식에 대한 조엘의 견해를 읽으셨을 겁니다.

엑셀은 다른 오피스 제품과 마찬가지로 COM을 통해 내장을 수출합니다.Windows에서 실행 중이고 Excel이 설치되어 있다면 C++, VB, C# 및 COM Interop이 있는 다른 모든 언어에서 사용할 수 있습니다.(일반 C에서는 COM으로 갈 수 없습니다.이것이 행운인지 불행인지는 당신에게 달려 있습니다.)

하지만 COM은 관리되지 않는 언어들에게 피비린내 나는 골칫거리입니다.다음 VB:

Set objExcel = CreateObject("Excel.Application")  ' start or use existing Excel
objExcel.Visible = True                           ' show the window
objExcel.Workbooks.Add                            ' create an empty workbook

는 대략 다음과 같은 C++로 번역됩니다.

#include <assert.h>
#include <ole2.h>
#include <tchar.h>

int main() {
    HRESULT hr;
    IDispatch *objExcel, *objWorkbooks;
    CLSID clsid;
    DISPID id, id2;
    DISPPARAMS p;
    VARIANT v;
    TCHAR *name;

    CoInitialize(NULL);

    hr = CLSIDFromProgID(_T("Excel.Application"), &clsid);
    assert(SUCCEEDED(hr));
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
            IID_IDispatch, (LPVOID *)&objExcel);
    assert(SUCCEEDED(hr));

    id2 = DISPID_PROPERTYPUT;
    name = _T("Visible");
    hr = objExcel->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    VariantInit(&v);
    v.vt = VT_I4;
    v.lVal = 1;
    p.cArgs = 1;
    p.rgvarg = &v;
    p.cNamedArgs = 1;
    p.rgdispidNamedArgs = &id2;
    hr = objExcel->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYPUT, &p, NULL, NULL, NULL);
    assert(SUCCEEDED(hr));

    name = _T("Workbooks");
    hr = objExcel->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    p.cArgs = 0;
    p.rgvarg = NULL;
    p.cNamedArgs = 0;
    p.rgdispidNamedArgs = NULL;
    hr = objExcel->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYGET, &p, &v, NULL, NULL);
    assert(SUCCEEDED(hr));
    objWorkbooks = v.pdispVal;

    name = _T("Add");
    hr = objWorkbooks->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    p.cArgs = 0;
    p.rgvarg = NULL;
    p.cNamedArgs = 0;
    p.rgdispidNamedArgs = NULL;
    hr = objWorkbooks->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYGET, &p, NULL, NULL, NULL);
    assert(SUCCEEDED(hr));

    return 0;
}

무료 라이브러리이지만 C: Excel 형식이 아닌 C++입니다.

저는 임시변통이 게시한 내용에 대한 작은 확장자를 가지고 있습니다.ID 디스패치 인터페이스로 쉽게 칠할 수 있는 매우 편리한 라이브러리가 있습니다.http://disphelper.sourceforge.net/

프로젝트에 추가하는 파일은 하나지만 C로 ID 디스패치 프로그래밍을 거의 재미있게 만듭니다;-)

다른 옵션은 Excel XLSX 파일을 작성하기 위한 C 라이브러리인 libxlsxwriter를 사용하는 것입니다.하지만 엑셀 파일을 읽을 수 없고 XLS 파일을 지원하지 않습니다.

언급URL : https://stackoverflow.com/questions/493111/what-is-a-simple-and-reliable-c-library-for-working-with-excel-files

반응형