Создание файлов Excel из C # без офиса [дубликаты]

Просто для того, чтобы немного увеличить точки Джоэля:

Это намного проще, если вы выделяете свои массивы так, чтобы они были смежными (что-то «многомерные массивы» C не дают вам автоматически:)

int **alloc_2d_int(int rows, int cols) {
    int *data = (int *)malloc(rows*cols*sizeof(int));
    int **array= (int **)malloc(rows*sizeof(int*));
    for (int i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

/*...*/
int **A;
/*...*/
A = alloc_2d_init(N,M);

Затем вы можете выполнять отправку и получение всего массива NxM с помощью

MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);

, а когда вы закончите, освободите память с помощью

free(A[0]);
free(A);

Кроме того, MPI_Recv - это блокировка, и MPI_Send может быть блокирующей отправкой. Одна вещь, которая означает, по мнению Джоэла, состоит в том, что вам определенно не нужны барьеры. Кроме того, это означает, что если у вас есть шаблон отправки / получения, как указано выше, вы можете попасть в тупик - все отправляются, никто не получает. Более безопасным является:

if (myrank == 0) {
   MPI_Send(&(A[0][0]), N*M, MPI_INT, 1, tagA, MPI_COMM_WORLD);
   MPI_Recv(&(B[0][0]), N*M, MPI_INT, 1, tagB, MPI_COMM_WORLD, &status);
} else if (myrank == 1) {
   MPI_Recv(&(A[0][0]), N*M, MPI_INT, 0, tagA, MPI_COMM_WORLD, &status);
   MPI_Send(&(B[0][0]), N*M, MPI_INT, 0, tagB, MPI_COMM_WORLD);
}

. Другим, более общим, подходом является использование MPI_Sendrecv:

int *sendptr, *recvptr;
int neigh = MPI_PROC_NULL;

if (myrank == 0) {
   sendptr = &(A[0][0]);
   recvptr = &(B[0][0]);
   neigh = 1;
} else {
   sendptr = &(B[0][0]);
   recvptr = &(A[0][0]);
   neigh = 0;
}
MPI_Sendrecv(sendptr, N*M, MPI_INT, neigh, tagA, recvptr, N*M, MPI_INT, neigh, tagB, MPI_COMM_WORLD, &status);

или неблокирующие сообщения и / или получение.

54
задан Patrick Hofman 21 March 2018 в 08:38
поделиться

7 ответов

Если на сервере / ПК не установлен Excel или не используется внешний инструмент (что возможно без использования взаимодействия с Excel, см. Создание Excel (. XLS и .XLSX) из C # ), он завершится ошибкой . Для использования взаимодействия требуется установка Excel.

36
ответ дан 24 November 2019 в 19:26
поделиться

Вы можете использовать класс ExcelStorage из библиотеки FileHelpers , это очень просто и просто ... вам понадобится Excel 2000 или более поздняя версия, установленная на машине.

FileHelpers - это бесплатная и простая в использовании библиотека .NET для импорта / экспорта данных из записей фиксированной длины или с разделителями в файлах, строках или потоках.

3
ответ дан 24 November 2019 в 19:26
поделиться

Используйте OleDB, вы можете создавать, читать и редактировать файлы Excel довольно легко. Прочтите документацию MSDN для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/aa288452 (VS.71) .aspx

Я использовал OleDB для чтения из файлов Excel, и я знаю, что вы можете их создать, но я не делал этого на собственном опыте.

7
ответ дан 24 November 2019 в 19:26
поделиться

Если вы заинтересованы в создании файлов .xlsx (Office 2007 и более поздних версий), вам повезло. Office 2007+ использует OpenXML, который из-за отсутствия более точного описания представляет собой XML-файлы внутри zip с именем .xlsx

. Возьмите файл Excel (2007+) и переименуйте его в .zip, вы можете открыть его и посмотреть . Если вы используете .NET 3.5, вы можете использовать библиотеку System.IO.Packaging для управления отношениями и самим zip-файлом, а также linq to xml для игры с xml (или просто DOM, если вам удобнее).

В противном случае рекомендую DotNetZip , мощную библиотеку для работы с zip-файлами.

OpenXMLDeveloper содержит множество ресурсов по OpenXML, и вы можете найти больше там.

Если вам нужен .xls (2003 и ниже), вам придется заглянуть в сторонние библиотеки или, возможно, самостоятельно изучить формат файла, чтобы достичь этого без установленного Excel.

40
ответ дан 24 November 2019 в 19:26
поделиться

Взаимодействие вызывает что-то еще, это сборка взаимодействия, поэтому вы взаимодействуете с чем-то ... в данном случае с Excel, фактически установленным Excel.

В этом случае да, он не запустится, потому что он зависит от Excel, вы просто вызываете функции Excel. Если он не установлен ... не повезло.

Существуют методы генерации без Excel, при условии, что формат файла 2007 подходит, вот несколько:

, однако, как я уже сказал, это формат 2007 , обычно, во всяком случае, это нарушает условия сделки.

10
ответ дан 24 November 2019 в 19:26
поделиться

Попробуйте EPPlus , если вы используете Excel 2007. Поддерживает диапазоны, стиль ячеек, диаграммы, фигуры, изображения и многое другое

28
ответ дан 24 November 2019 в 19:26
поделиться

Есть несколько вариантов:

  • NPOI - Это бесплатный и открытый исходный код.
  • Aspose - определенно не бесплатно, но надежно.
  • Электронная таблица ML - В основном XML для создания электронных таблиц.

Использование Interop потребует, чтобы Excel был установлен на машине, с которой он запущен. В решении на стороне сервера это будет ужасно. Вместо этого вам следует использовать инструмент, подобный приведенному выше, который позволяет создавать файл Excel без установки Excel.

Если у пользователя нет Excel, но есть инструмент, который будет читать Excel (например, Open Office), то, очевидно, он сможет его открыть. У Microsoft есть бесплатная программа просмотра Excel , доступная для тех пользователей, у которых нет Excel.

11
ответ дан 24 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: