在C ++中格式化输出excel文件的单元格

时间:2015-11-14 22:10:21

标签: c++ excel csv

今天我的问题并不是非常重要的事情,但这只是我在朋友的某些方面遇到过的问题。

一位这样的朋友希望我制作一个程序,基本上,将整数1-52随机存储到2个独立的数组中,用于他喜欢的游戏。从那里代码读取数组(基本上每个玩家一个),确定哪个字符与该索引中的随机数相关,然后导出它。最后,你可以在两个玩家之间平均分配所有52个字符(每个26个),没有重复。主程序工作正常,但我想让它好一点。

我的问题是我做了什么让它更容易阅读。我不是简单地将信息导出到文本文件,而是将这些信息作为Excel电子表格更好地用于更方便的编辑目的,以及轻松地将信息作为表格查看。再一次,这很好。

但是,许多信息超出了文档中单元格的默认大小。此外,作为一个整体,所有细胞居中的信息看起来会更好。我不知道每次运行程序时都必须手动执行此操作,而是想知道是否有办法将这些格式化更改直接集成到代码本身中,如果存在,是否可以通过相对较少的工作完成?必须学习一些疯狂的东西只是为了某些美学而我只是为朋友建立的东西并不值得。在此先感谢您的帮助!

#include <iostream>
#include <math.h>
#include <string>
#include <fstream>
using namespace std;

void exportToExcel(int[], int[], int);
string printChar(int[], int);
bool isPicked(int);

int pastRandoms[52];
ofstream outFile;

void main()
{
    const int CHAR_PER_PLAYER = 26;
    int random, player1[CHAR_PER_PLAYER], player2[CHAR_PER_PLAYER];
    string filename = "Roster.csv";
    outFile.open(filename);
    if (outFile.fail())
    {
        cout << "FAILED";
        exit(1);
    }
    for (short count = 0; count < 52; count++)
        pastRandoms[count] = 0;
    for (short count = 0; count < CHAR_PER_PLAYER; count++)
    {
        do
        {
            random = rand() % 52 + 1;
        } while (isPicked(random));
        player1[count] = random;
    }
    for (short count = 0; count < CHAR_PER_PLAYER; count++)
    {
        do
        {
            random = rand() % 52 + 1;
        } while (isPicked(random));
        player2[count] = random;
    }
    exportToExcel(player1, player2, CHAR_PER_PLAYER);
    outFile.close();
}

bool isPicked(int r)
{
    for (short c = 0; c < 52; c++)
        if (r == pastRandoms[c])
            return true;
    for (short c = 0; c < 52; c++)
    {
        if (pastRandoms[c] == 0)
        {
            pastRandoms[c] = r;
            break;
        }
    }
    return false;
}

void exportToExcel(int p1[], int p2[], int n)
{
    outFile << ", Player 1, Player2" << endl;
    for (short c = 0; c < n; c++)
    {
        outFile << c + 1 << "," << printChar(p1, c) << "," << printChar(p2, c) << endl;
    }
}

注意:我故意省略了printChar功能。它只是一个巨大的转换声明。 1-52中的每个数字都有自己的大小写,并返回相应的名称。我觉得最好从我最初的问题中留下这么麻烦的功能。

2 个答案:

答案 0 :(得分:0)

你在.csv文件中保存的每件事都只是文本结构。 .csv文件是文本类型(没有随机文件),例如,如果您将.belv文件保存在.csv文件中:

阿里;礼;哈米德; / N

赛义德;穆罕默德; hosain;

然后当你在excel中打开顶层文件时,它作为一个包含2行和3列的表,你不能直接以实际形式保存数学算术(表达式),例如当你在单元格中保存'= 10 + 2'时.csv文件,它在文件中保存为'12'(没有'= 10 + 2')!你不能为.csv文件中的单元格定义格式,因为.csv文件存储为文本文件。

如果你想创建.xlsx文件并使用那些灵活性或使用单元格格式,你必须在你的程序中使用excel类和函数!

答案 1 :(得分:0)

控制导入Microsoft Excel的数据格式的唯一方法是在编码时将此数据导出为xlsxlsx文件,而不是csv文件正在做(还有其他格式,MS Excel知道如何导入,包括足够的格式元数据来控制导入数据的外观,但出于所有实际目的,这里的答案仅限于xlsxlsx )。

Microsoft Excel将CSV格式的数据按原样导入到具有默认格式的单元格中,并且您无法对其进行控制。如果您要导入带格式化单元格的内容,则必须生成xlsxlsx文件。

您的问题未指定您正在使用的操作系统。如果您使用的是MS-Windows,我相信您可以在Microsoft的大量文档中快速找到使用生成xlsx格式文件的相应软件库的完整说明。

在Linux上,情况有点模糊。我知道几个可以轻松生成xlsx文件的Perl模块,但没有想到C ++库。

但是,xlsx只是一个gzipped的XML文件集合,并且有很多关于Intertubes的文档(至少在大多数情况下),xlsx文件的内部格式,以及它不应该太难写自己的实现。不久之前我在Perl中做了同样的事情 - 生成导入到Excel中的格式化xlsx文件 - 在C ++中创建同样的东西不需要很长时间。