Qt实例:利用QTableWidget编辑xls,txt文件

一 效果图

二 代码

2.1 头文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>

namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();//增加行数
    void on_pushButton_2_clicked();//导出
    void on_pushButton_3_clicked();//导入
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

2.2 核心代码 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tableWidget->clear();

    ui->tableWidget->setColumnCount(8);//只设置列数,行数动态中增加
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"城市"<<"总云量"<<"降水量"<<"能见度"<<"温度"<<"湿度"<<"风向"<<"风速");
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);//设置表格选中单个单元格的方式
    //ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改
    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//单个选中和多个选中的设置
    ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头
    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(70); //设置列宽

    QFont font = ui->tableWidget->horizontalHeader()->font(); //先获取字体
    font.setBold(true); //字体设置为粗体
    ui->tableWidget->horizontalHeader()->setFont(font); //设置每一列的标题字体为粗体
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    int RowCont;
    RowCont=ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(RowCont);//增加一行
}


void MainWindow::on_pushButton_2_clicked()
{
        //QString filepath = QFileDialog::getSaveFileName(this, tr("保存文件"),QString(), tr("EXCEL files (*.xls);;HTML-Files (*.txt);;"));
        QString filepath = "F:/1.xls";

        if (!filepath.isEmpty())
        {
            int row = ui->tableWidget->rowCount();
            int col = ui->tableWidget->columnCount();

            QList<QString> list;
            //添加列标题
            QString HeaderRow;
            for (int i = 0; i < col; i++)
            {
                HeaderRow.append(ui->tableWidget->horizontalHeaderItem(i)->text() + "\t");
            }
            list.push_back(HeaderRow);

            for (int i = 0; i < row; i++)
            {
                QString rowStr = "";
                for (int j = 0; j < col; j++){
                    if(ui->tableWidget->item(i,j)!=0)
                    {
                         rowStr += ui->tableWidget->item(i, j)->text() + "\t";
                    }
                    else
                    {
                          QMessageBox::information(0,tr("提示"),tr("增加的当前行数据为空!"));
                          break;
                    }
                }
                list.push_back(rowStr);
            }
            QTextEdit textEdit;
            for (int i = 0; i < list.size(); i++)
            {
                textEdit.append(list.at(i));
            }
            QFile file(filepath);
            if (file.open(QFile::WriteOnly | QIODevice::Text))
            {
                QTextStream ts(&file);
                ts.setCodec("GB2312");//这个地方大家自己判断是否用“utf-8”
                ts << textEdit.document()->toPlainText();
                file.close();
            }
            //导出后将表格情况,这一步大家自己选择要不要
            //ui->tableWidget->clearContents();
            //ui->tableWidget->setRowCount(0);
        }
}

void MainWindow::on_pushButton_3_clicked()
{
    //QString fileName = QFileDialog::getOpenFileName(0, tr("导入文件"),QString(), tr("EXCEL files (*.xls);;HTML-Files (*.txt);;"));
    QString fileName = "F:/1.xls";

        if(!fileName.isEmpty())
        {
            QFile file;
            file.setFileName(fileName);
            //打开文件
            if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                QMessageBox msg;
                msg.setText("打开文件失败!");
                msg.exec();
            }
            else
            {
                if(!file.size())
                {
                    QMessageBox::warning(0,tr("警告"),tr("文件大小为空!"),QMessageBox::Ok);
                }
                else
                {
                    //将文件数据导入表格
                    int r_count = 0;        //统计文件的行数
                    QStringList textList;   //记录文件中每一行的数据
                    QTextStream in(&file);
                    while (!in.atEnd())
                    {
                        QString line = in.readLine();
                        textList.append(line);          //保存文件的数据
                        r_count++;                      //记录文件的行数 前两行为表头
                    }

                    file.close();
                    if(!textList.isEmpty() && r_count>1)
                    {
                        QStringList listColHeader = textList.at(1).split("\t");
                        QStringList listRowHeader = textList.at(0).split("\t");
                        int c_count = listRowHeader.count();
                        ui->tableWidget->clear();
                        ui->tableWidget->setRowCount(r_count-1);      //前1行是行表头
                        ui->tableWidget->setColumnCount(c_count-1);   //最后一行是“\t"
                        ui->tableWidget->setHorizontalHeaderLabels(listRowHeader);
                        ui->tableWidget->setVerticalHeaderLabels(listColHeader);
                        qDebug()<<"start importTable row count:::"<<r_count<<"col count:::"<<c_count;

                        for(int row = 0; row < r_count; row++)
                        {
                            QStringList tmpList;
                            tmpList = textList.at(row).split("\t");

                            for(int col = 0; col < c_count; col++)
                            {
                                QTableWidgetItem *item = new QTableWidgetItem(tmpList.at(col));

                                ui->tableWidget->setItem(row-1, col, item);
                            }
                        }
                        QMessageBox::information(0,tr("提示"),tr("导入成功!"));
                    }
                    else
                    {
                      QMessageBox::information(0,tr("提示"),tr("文件数据为空!"));
                    }
                }
            }
        }
        else
        {
            QMessageBox::warning(0,tr("警告"),tr("文件名未指定!"),QMessageBox::Ok);
        }
}

参考文章:https://blog.csdn.net/sinat_30440627/article/details/53978580
                  https://blog.csdn.net/graceland525/article/details/45150489
                  https://blog.csdn.net/cwj066/article/details/83344705
                  https://blog.csdn.net/polokang/article/details/6696982

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值