(ios开发)导出tableView数据至excel

1 篇文章 0 订阅
1 篇文章 0 订阅

点击打开链接引言

在网上搜了好多的资料,把数据导出为excel格式,找了好久的资料都没找到。今天就写一篇教程给大家学习,如果有什么问题大家可以联系我。

0、开始的时候因为没有找到导出excel格式的文章,倒是找到了导出csv格式的文件的方法,但是由于中文乱码中文问题,问题一直没有找到好的解决方法。这里我也稍微介绍一下:

- (void)exportCSV:(NSString *)fileName {
    
    
    NSOutputStream *output = [[NSOutputStream alloc] initToFileAtPath:fileName append:YES];
    [output open];
    
    
    if (![output hasSpaceAvailable]) {
        NSLog(@"没有足够可用空间");
    } else {
        
        NSString *header = @"学号,姓名\n";   //这里是文件第一行的头(逗号是换列,\n是换行)

        const uint8_t *headerString = (const uint8_t *)[header cStringUsingEncoding:NSUTF8StringEncoding];
        NSInteger headerLength = [header lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
        NSInteger result = [output write:headerString maxLength:headerLength];
        if (result <= 0) {
            NSLog(@"写入错误");
        }
        
        
        NSArray *students = [self queryStudents];
        for (Student *stu in students) {
           
            NSString *row = [NSString stringWithFormat:@"%@,%@\n", stu.num, stu.name];   //循环插入数据<span style="font-family: Arial, Helvetica, sans-serif;">(逗号是换列,\n是换行)</span>

            const uint8_t *rowString = (const uint8_t *)[row cStringUsingEncoding:NSUTF8StringEncoding];
            NSInteger rowLength = [row lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
            result = [output write:rowString maxLength:rowLength];
            if (result <= 0) {
                NSLog(@"无法写入内容");
            }
            
        }
        
        [output close];
    }
}
生成csv文件:

 NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES);
    NSString *docementDir = [documents objectAtIndex:0];
    self.filePath = [docementDir stringByAppendingPathComponent:@"Student.csv"];
    NSLog(@"filePath = %@", self.filePath);
    
    
    [self createFile:self.filePath];
    [self exportCSV:self.filePath];
1、现在开始进入正题,要先下载微软的excel库文件 http://www.libxl.com/download.html,解压后

2、里面有example,可以参考一下、把LibXL.framework导入自己的项目当中,设置bitcode为no,以及linker也要改为-lstdc++,如图


3、上代码,导入头文件,设置代理

#include "LibXL/libxl.h"
@interface JGdetailController ()<UITableViewDataSource,UITableViewDelegate,JGPeopleViewDelegate,UIDocumentInteractionControllerDelegate>
<pre name="code" class="objc">-(void)clickBarButton{
    NSLog(@"createExcel");

    BookHandle book = xlCreateBook(); // use xlCreateXMLBook() for working with xlsx files
    
    SheetHandle sheet = xlBookAddSheet(book, "Sheet1", NULL);
    //第一个参数代表插入哪个表,第二个是第几行(默认从0开始),第三个是第几列(默认从0开始)
    xlSheetWriteStr(sheet, 1, 0, "姓名", 0);
    xlSheetWriteStr(sheet, 1, 1, "性别", 0);
    xlSheetWriteStr(sheet, 1, 2, "学校", 0);
    xlSheetWriteStr(sheet, 1, 3, "电话", 0);
    
    
    for (int i = 0; i < self.nameArray.count; i++) {
        const char *name_c = [self.nameArray[i] cStringUsingEncoding:NSUTF8StringEncoding];  //这里是将NSString字符串转为C语言字符串
        xlSheetWriteStr(sheet, i+2, 0,name_c, 0);
       
    }
    for (int i = 0; i < self.sexArray.count; i++) {
        const char *sex_c = [self.sexArray[i] cStringUsingEncoding:NSUTF8StringEncoding];
        xlSheetWriteStr(sheet, i+2, 1,sex_c, 0);
      
    }
    for (int i = 0; i < self.schoolArray.count; i++) {
        const char *school_c = [self.schoolArray[i] cStringUsingEncoding:NSUTF8StringEncoding];
        xlSheetWriteStr(sheet, i+2, 2,school_c, 0);
        
    }
    for (int i = 0; i < self.phoneArray.count; i++) {
        const char *phone_c = [self.phoneArray[i] cStringUsingEncoding:NSUTF8StringEncoding];
        xlSheetWriteStr(sheet, i+2, 3,phone_c, 0);
       
    }

    
    NSString *documentPath =
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filename = [documentPath stringByAppendingPathComponent:@"out.xls"];
    NSLog(@"filepath--%@",filename);
    
    xlBookSave(book, [filename UTF8String]);
    
    xlBookRelease(book);
    
    //导出xls文件
    UIDocumentInteractionController *docu = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filename]];
    
    docu.delegate = self;
    CGRect rect = CGRectMake(0, 0, 320, 300);  //这里感觉没什么用
    
    [docu presentOpenInMenuFromRect:rect inView:self.view animated:YES];  //不写可以直接预览
    
    [docu presentPreviewAnimated:YES];  //这句比较坑爹。如果不写这句,只写上面那句会弹出选择支持xls文件的APP。但是如果没写程序就会崩了,还有一个<p class="p1"><span class="s1">                                        //[docu </span><span class="s2">presentOptionsMenuFromRect</span><span class="s1">:rect </span><span class="s2">inView</span><span class="s1">:</span><span class="s3">self</span><span class="s1">.</span><span class="s4">view</span><span class="s1"> </span><span class="s2">animated</span><span class="s1">:</span><span class="s3">YES</span><span class="s1">];可以研究下。</span></p>

}
//doucumentDelegate方法(必须实现,还有几个展示选择系统自带print还是啥的就不说了,可以自己研究下)
- ( UIViewController *)documentInteractionControllerViewControllerForPreview:( UIDocumentInteractionController *)interactionController{
    
    return self;
    
}


 4、把模型tableView里面的数据取出来放在数组里: 

 self.nameArray = [NSMutableArray array];
        self.sexArray = [NSMutableArray array];
        self.schoolArray = [NSMutableArray array];
         self.phoneArray = [NSMutableArray array];
        for (JGdetail *de in self.people) {
            [self.nameArray addObject:de.name];
            if(de.sex == 0){
                [self.sexArray addObject:@"男"];
            }else if(de.sex == 1){
                [self.sexArray addObject:@"女"];
            }
             [self.schoolArray addObject:de.school];
             [self.phoneArray addObject:de.tel];
        }
        NSLog(@"Array---%@",self.sexArray);
5、这样就可以选择QQ打开生成的xls文件。效果如下,因为这个是要收费的,所以忽略第一行:

好了,我也是个才接触IOS开发,希望这篇文章能帮到大家,转载请指明出处。


这边好久没更新维护了,大家可以去我的博客阅读原文(点击打开链接
http://download.csdn.net/detail/ningcol/9652601 源码地址

如果你觉得我的创作对您有帮助,非常感谢您的打赏支持







  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 要将Qt中的TableView导出Excel,您需要完以下步骤: 1.将Qt中的TableView中的数据存储到QStandardItemModel对象中。 2.使用QXlsx库中的功能,将QStandardItemModel对象中的数据写入Excel文件。 以下是一些示例代码,可以用作参考: ```cpp #include <QStandardItemModel> #include <QFile> #include <QDir> #include <QFileDialog> #include <QMessageBox> #include "xlsxdocument.h" // 将TableView中的数据存储到QStandardItemModel对象中 QStandardItemModel* createStandardModelFromTableView(QTableView* tableView) { QStandardItemModel* standardModel = new QStandardItemModel; // 获取TableView中的列数和行数 int numCols = tableView->model()->columnCount(); int numRows = tableView->model()->rowCount(); // 设置QStandardItemModel的列数和行数 standardModel->setColumnCount(numCols); standardModel->setRowCount(numRows); // 将TableView中的数据复制到QStandardItemModel中 for (int i = 0; i < numRows; ++i) { for (int j = 0; j < numCols; ++j) { QModelIndex index = tableView->model()->index(i, j); QVariant data = tableView->model()->data(index, Qt::DisplayRole); standardModel->setData(standardModel->index(i, j), data); } } return standardModel; } // 将QStandardItemModel对象中的数据写入Excel文件 void writeStandardModelToExcel(QStandardItemModel* standardModel) { QXlsx::Document xlsx; int numCols = standardModel->columnCount(); int numRows = standardModel->rowCount(); // 写入表头 for (int j = 0; j < numCols; ++j) { QModelIndex index = standardModel->index(0, j); QVariant data = standardModel->data(index, Qt::DisplayRole); xlsx.write(1, j + 1, data.toString()); } // 写入数据 for (int i = 1; i < numRows; ++i) { for (int j = 0; j < numCols; ++j) { QModelIndex index = standardModel->index(i, j); QVariant data = standardModel->data(index, Qt::DisplayRole); xlsx.write(i + 1, j + 1, data.toString()); } } // 保存Excel文件 QString filePath = QFileDialog::getSaveFileName(nullptr, "Save Excel File", QDir::homePath(), "*.xlsx"); if (!filePath.isEmpty()) { if (xlsx.saveAs(filePath)) { QMessageBox::information(nullptr, "Success", "Excel file saved successfully!"); } else { QMessageBox::warning(nullptr, "Error", "Failed to save Excel file!"); } } } // 在按钮点击事件中调用上述两个函数 void onExportToExcelButtonClicked() { QStandardItemModel* standardModel = createStandardModelFromTableView(tableView); writeStandardModelToExcel(standardModel); } ``` 请注意,上述代码中使用了QXlsx库来将数据写入Excel文件。要使用此库,您需要将其包含在项目中,并在.pro文件中添加以下行: ```qmake LIBS += -L/path/to/QXlsx/lib -lQXlsx INCLUDEPATH += /path/to/QXlsx/include ``` 其中您好!要将Qt中的TableView导出Excel,您可以按照以下步骤进行操作: 1. 引入相应的头文件和库文件:QTableView,QStandardItemModel,QFileDialog,QXlsx。 2. 创建一个QStandardItemModel模型,并使用QTableView加载模型。 3. 获取TableView的行数和列数。 4. 创建一个QXlsx::Document对象,并指定导出Excel文件名。 5. 将TableView中的数据复制到QXlsx::Document中。 6. 保存Excel文件。 以下是一个简单的示例代码,用于将TableView导出Excel: ```cpp #include <QtWidgets/QTableView> #include <QtWidgets/QApplication> #include <QtXlsx> #include <QFileDialog> #include <QStandardItemModel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTableView tableView; QStandardItemModel model; tableView.setModel(&model); // 设置TableView的列数和行数 model.setColumnCount(3); model.setRowCount(4); // 往TableView中插入数据 for(int row=0; row<4; row++) { for(int col=0; col<3; col++) { QModelIndex index = model.index(row, col, QModelIndex()); model.setData(index, QVariant(QString("row%1,col%2").arg(row+1).arg(col+1))); } } // 获取TableView的行数和列数 int rows = model.rowCount(); int cols = model.columnCount(); // 创建QXlsx::Document对象 QXlsx::Document xlsx; // 设置Excel文件名并打开保存对话框 QString fileName = QFileDialog::getSaveFileName(NULL, "Save File", "", "Excel files (*.xlsx)"); if(fileName.isNull()) { return -1; } // 将TableView中的数据复制到QXlsx::Document中 for(int row=0; row<rows; row++) { for(int col=0; col<cols; col++) { QModelIndex index = model.index(row, col, QModelIndex()); QString text = model.data(index).toString(); xlsx.write(row+1, col+1, text); } } // 保存Excel文件 xlsx.saveAs(fileName); return a.exec(); } ``` 希望这能对您有所帮助! ### 回答2: 在Qt中,我们可以使用QTableView来显示和编辑表格数据。如果我们想将一个QTableView导出Excel,我们需要将表格数据提取到一个QStandardItemModel中,然后将数据写入到Excel文件中,这可以通过QXlsx库实现。 首先,我们需要在项目中添加QXlsx库。可以在.pro文件中添加如下代码: ``` QT += xlsx ``` 然后在代码中使用以下方法导出Excel: ```cpp void MainWindow::exportToExcel() { QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->tableView->model()); if (!model) return; QXlsx::Document xlsx; QXlsx::Worksheet *worksheet = xlsx.addWorksheet(); // 将表头写入excel QStringList headerList; for (int i = 0; i < model->columnCount(); i++) { headerList << model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); worksheet->write(1, i + 1, headerList[i]); } // 将数据写入excel for (int row = 0; row < model->rowCount(); row++) { for (int column = 0; column < model->columnCount(); column++) { QModelIndex index = model->index(row, column); QString data = model->data(index, Qt::DisplayRole).toString(); worksheet->write(row + 2, column + 1, data); } } // 保存excel文件 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Excel"), "", tr("Excel Files (*.xlsx)")); if (!fileName.isEmpty()) { xlsx.saveAs(fileName); } } ``` 在以上代码中,我们首先将QTableView中的数据提取到QStandardItemModel中。然后使用QXlsx库的Document类创建一个Excel文档,并创建一个Worksheet对象。我们可以使用QStandardItemModel中的headerData方法来获取表头,并将表头写入到Excel中。 然后,我们遍历QStandardItemModel中的所有行和列,使用QStandardItemModel中的data方法获取单元格数据,并将其写入到Excel中。 最后,我们使用QFileDialog选择一个保存的位置和文件名,并将Excel文件保存。 通过以上步骤,我们就可以很容易地将QTableView中的数据导出Excel中,完数据的转换和保存。 ### 回答3: Qt是一个广泛使用的跨平台C++应用程序框架,它提供了一个操作系统独立的API,用于编写图形用户界面程序、网络应用程序和数据库应用程序。在Qt中,可以使用QtCore和QtGui模块中的类来处理Excel文件。 要将Qt中的TableView控件导出Excel,可以使用QAxObject类,该类允许自动化调用COM组件。使用QAxObject类可以打开、读取、编辑和保存Excel文件。 以下是一些步骤来将TableView在Qt中导出Excel: 1.在Qt项目中添加QAxObject类的头文件。 #include <QAxObject> 2.使用QAxObject打开Excel应用程序 QApplication app(argc, argv); QAxObject* excel = new QAxObject("Excel.Application", 0); 3.设置Excel应用程序的可见性 excel->setProperty("Visible", true); 4.创建Excel工作簿和工作表 QAxObject* workbooks = excel->querySubObject("Workbooks"); workbooks->dynamicCall("Add"); QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", 1); 5.将TableView中的数据写入Excel工作表 QAbstractItemModel* model = tableView->model(); for (int row = 0; row < model->rowCount(); row++) { for (int column = 0; column < model->columnCount(); column++) { QModelIndex index = model->index(row, column); QString data = model->data(index).toString(); QAxObject* cell = worksheet->querySubObject("Cells(int, int)", row + 1, column + 1); cell->setProperty("Value", data); } } 6.保存Excel文件并退出Excel应用程序 workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators("file.xlsx")); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); 通过这些步骤,就可以将TableView控件中的数据导出Excel文件中。使用QAxObject类可以轻松创建、编辑和保存Excel工作簿,而且可以将TableView中的数据直接写入Excel工作表中。这是一个非常方便的方法,可以将数据TableView导出并使用Excel进行处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值