zoukankan      html  css  js  c++  java
  • BasicExcel的使用

    from:http://www.cnblogs.com/paullam/p/3705924.html
     
    使用的平台:vs2013 控制台
    创建时需要注意, 安全开发生命周期(SDL)检查 不能勾选(不嫌麻烦的话就默认选吧)
     
     
    本文百度云下载: http://pan.baidu.com/s/1i5NRg6x //其中ExcelRead.cpp为CSDN作者的演示
    CSDN download: http://download.csdn.net/download/xcwmy/6992365 //其中ExcelRead.cpp为CSDN作者的演示
    参考:OpenOffice's Excel file format (http://sc.openoffice.org/excelfileformat.pdf)
     
    一个用STL C++写的读写Excel文件的类,是CSpreadSheet作者封装的,与CSpreadSheet的区别:不依赖ODBC,而CSpreadSheet依赖ODBC,需要MFC库的支持,不能跨平台。
    BasicExcel的限制:
    1)不支持格式化;
    2)不支持公式;
    3)不支持图表;
    4)不支持Unicode UTF-32;
    5)中文支持不好;
     

    class BasicExcel

    void New(int sheets=3)
    创建一个新工作薄,默认3张工作表
    bool Load(const char* filename)
    载入一个已存在的工作薄文件
    bool Save()
    保存当前工作薄到已载入文件
    bool SaveAs(const char* filename)
    保存当前工作薄到一个新文件
    size_t GetTotalWorkSheets()
    获取当前工作薄的工作表数目
    BasicExcelWorksheet* GetWorksheet(size_t sheetIndex)
    BasicExcelWorksheet* GetWorksheet(const char* name)
    BasicExcelWorksheet* GetWorksheet(const wchar_t* name)
    获取指定索引的工作表对象,索引从0开始,索引无效则返回值为NULL
    获取指定名称的工作表对象,名称无效则返回值为NULL
    BasicExcelWorksheet* AddWorksheet(int sheetIndex=-1)
     
     
    BasicExcelWorksheet* AddWorksheet(const char* name, int sheetIndex=-1)
    BasicExcelWorksheet* AddWorksheet(const wchar_t* name, int sheetIndex=-1)
    添加指定索引的工作表,名称默认为SheetX,X从1开始,如果sheetIndex==-1,则默认添加到最后一个位置
     
    添加指定名称和索引的工作表,如果sheetIndex==-1,则默认添加到最后一个位置
    bool DeleteWorksheet(size_t sheetIndex)
    bool DeleteWorksheet(const char* name)
    bool DeleteWorksheet(const wchar_t* name)
    删除指定索引或名称的工作表
    char* GetAnsiSheetName(size_t sheetIndex)
    wchar_t* GetUnicodeSheetName(size_t sheetIndex)
    bool GetSheetName(size_t sheetIndex, char* name)
    bool GetSheetName(size_t sheetIndex, wchar_t* name)
    获取指定索引的工作表名称
    bool RenameWorksheet(size_t sheetIndex, const char* to)
    bool RenameWorksheet(size_t sheetIndex, const wchar_t* to)
    bool RenameWorksheet(const char* from, const char* to)
    bool RenameWorksheet(const wchar_t* from, const wchar_t* to)
    重命名指定索引或名称的工作表
     

    class BasicExcelWorksheet

    char* GetAnsiSheetName()
    wchar_t* GetUnicodeSheetName()
    bool GetSheetName(char* name)
    bool GetSheetName(wchar_t* name)
    获取当前工作表的名称
    bool Rename(const char* to)
    bool Rename(const wchar_t* to)
    重命名当前工作表
    void Print(ostream& os, char delimiter=',', char textQualifier='')
    输出整张工作表到指定输出流,指定列分隔字符和文本限定符
    指定列分隔符为','和文本限定符为'"',该函数可以用来保存当前工作表为CSV格式
    size_t GetTotalRows()
    获取当前工作表的总行数
    size_t GetTotalCols()
    获取当前工作表的总列数
    BasicExcelCell* Cell(size_t row, size_t col)
    获取指定行、列的单元格对象,行、列值从0开始,如果行值超过65535或者列值超过255则返回NULL
    bool EraseCell(size_t row, size_t col)
    清空指定行、列的单元格对象的内容
     

    class BasicExcelCell

    int Type() const
    获取单元格值类型,包括以下值:UNDEFINEDINTDOUBLESTRINGWSTRING
    bool Get(int& val) const
    bool Get(double& val) const
    bool Get(char* str) const
    bool Get(wchar_t* str) const
    从当前单元格获取指定类型的内容
    size_t GetStringLength()
    获取当前单元格字符串长度
    int GetInteger() const
    double GetDouble() const
    const char* GetString() const
    const wchar_t* GetWString() const
    从当前单元格获取指定类型的内容
    ostream& operator<<(ostream& os, const BasicExcelCell& cell)
    输出当前单元格内容到输出流中
    void Set(int val)
    void Set(double val)
    void Set(const char* str)
    void Set(const wchar_t* str)
    输出指定格式的内容到当前单元格
    void SetInteger(int val)
    void SetDouble(double val)
    void SetString(const char* str)
    void SetWString(const wchar_t* str)
    输出指定格式的内容到当前单元格
    void EraseContents()
    清空当前单元格的内容
     
     
    示例代码:在Qt线程中递归遍历文件夹中文件后将文件名和文件大小写入Excel表格
    main.cpp
    #include <QtCore/QCoreApplication>
    #include "mythread.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        MyThread mythread;
        mythread.setCurrentDirectory(QString("C:/Program Files/360"));
        mythread.setStart();
    
        return a.exec();
    }
    

      

    mythread.h

    #ifndef MY_THREAD_H
    #define MY_THREAD_H
    
    
    #include <QThread>
    #include <QMutex>
    #include <QWaitCondition>
    
    #include "BasicExcel.h"
    
    using namespace YExcel;
    
    class MyThread : public QThread
    {
        Q_OBJECT
    
    public:
        MyThread();
        ~MyThread();
    
        void setStart();
        void setCurrentDirectory(QString strCurrentDirectory);
        void recursiveTraverseDir(QString dirString);
    
    protected:
        void run();
    
    
    private:
        void ExportToExcel();
    
    private:
        bool bRunning;
        QWaitCondition waitRunning;
        QMutex mutex;
    
        QString strCurrentDirectory;
        QString strFileName;
        int  iFileSize;
    
        BasicExcel                beObject;
        BasicExcelWorksheet*    bewCurrentSheet;
        BasicExcelCell*            becCurrentCell;
        char                    strCurrentSheet[8];
        int                        iCurrentRow;
        int                        iSheetIndex;
    };
    
    #endif    // MY_THREAD_H
    

      

    mythread.cpp
    #include <QDir>
    #include <QFileInfo>
    #include <Qt>
    #include <QtGlobal>
    #include <QtCore/qmath.h>
    #include "mythread.h"
    
    MyThread::MyThread()
    {
        bRunning = false;
    
        beObject.New();
        bewCurrentSheet = beObject.GetWorksheet("Sheet1");
        iCurrentRow = 0;
        iSheetIndex = 1;
    
        start();
    }
    
    MyThread::~MyThread()
    {
        wait();
    }
    
    void MyThread::setStart()
    {
        QMutexLocker locker(&mutex);
        this->bRunning = true;
        waitRunning.wakeOne();
    }
    
    void MyThread::setCurrentDirectory(QString strCurrentDirectory)
    {
        QMutexLocker locker(&mutex);
        this->strCurrentDirectory = strCurrentDirectory;
    }
    
    void MyThread::run()
    {
        forever
        {
            {
                QMutexLocker locker(&mutex);
                if(!bRunning)
                {
                    waitRunning.wait(&mutex);
                }
            }
    
            recursiveTraverseDir(strCurrentDirectory);
            beObject.SaveAs("example.xls");
    
            {
                QMutexLocker locker(&mutex);
                if(bRunning)
                {
                    bRunning = false;
                }
            }
        }
    
    }
    
    void MyThread::recursiveTraverseDir(QString dirString)
    {
        QDir dir(dirString);
        if (!dir.exists())
        {
            return;
        }
    
        dir.setFilter(QDir::Dirs | QDir::Files);
        dir.setSorting(QDir::DirsFirst);
    
        QFileInfoList fileInfolist = dir.entryInfoList();
    
        int i = 0;
        bool bIsDir;
        QFileInfo fileInfo;
    
        do{
            fileInfo = fileInfolist.at(i);
            if(fileInfo.fileName() == "." | fileInfo.fileName() == "..")
            {
                i++;
                continue;
            }
    
            bIsDir = fileInfo.isDir();
            if (bIsDir)
            {
                recursiveTraverseDir(fileInfo.filePath());
            }
            else
            {    
                strFileName = fileInfo.fileName();
                iFileSize = qCeil((fileInfo.size()) / 1024);
    
                cout << strFileName.toLatin1().data() << "		" << iFileSize << endl;
    
                ExportToExcel();
            }
    
            msleep(50);
            i++;
    
        }while(i < fileInfolist.size());
    }
    
    void MyThread::ExportToExcel()
    {
        if(bewCurrentSheet)
        {
            becCurrentCell = bewCurrentSheet->Cell(iCurrentRow, 0);
            becCurrentCell->SetString(strFileName.toLatin1().data());
    
            becCurrentCell = bewCurrentSheet->Cell(iCurrentRow, 1);
            becCurrentCell->SetInteger(iFileSize);
    
            iCurrentRow++;
        }
    }
    

      

     
    执行结果:

     
     
     

    如果问题解决起来不妥或者有更好的解决办法,麻烦请告知,帮助曾经和你一样的入门者,谢谢。
  • 相关阅读:
    传纸条
    金明的预算方案
    矩阵取数
    能量项链
    选择客栈
    过河
    乌龟棋
    逢低吸纳
    三角形牧场
    多米诺骨牌
  • 原文地址:https://www.cnblogs.com/ourran/p/5882682.html
Copyright © 2011-2022 走看看