Как сделать корректный формат даты при записи данных в Excel

На самом деле вам придется использовать вложенные Navigator, когда у вас есть суб-навигационный поток или внутреннее путешествие. Пожалуйста, ознакомьтесь с документами о наложении навигаторов .

Однако, чтобы получить доступ к корневому навигатору, вы можете рекурсивно искать родителя Navigator из текущего Navigator и возвращать текущий Navigator, когда у него нет родителя Navigator.

Пример:

NavigatorState getRootNavigator(BuildContext context) {
  final NavigatorState state = Navigator.of(context);
  try {
    return getRootNavigator(state.context);
  } catch (e) {
    return state;
  }
}

//use it from any widget like
getRootNavigator(context);

РЕДАКТИРОВАТЬ:

Решение 1:

К получить конкретного родителя Navigator, я могу подумать о расширении текущего класса Navigator, чтобы принять id и найти Navigator по id. Примерно так:

class NavigatorWithId extends Navigator {
  const NavigatorWithId(
      {Key key,
      @required this.id,
      String initialRoute,
      @required RouteFactory onGenerateRoute,
      RouteFactory onUnknownRoute,
      List observers = const []})
      : assert(onGenerateRoute != null),
        assert(id != null),
        super(
          key: key,
          initialRoute: initialRoute,
          onGenerateRoute: onGenerateRoute,
          onUnknownRoute: onUnknownRoute,
          observers: observers,
        );

  // when id is null, the `of` function returns top most navigator
  final int id;

  static NavigatorState of(BuildContext context, {int id, ValueKey key}) {
    final NavigatorState state = Navigator.of(
      context,
      rootNavigator: id == null,
    );
    if (state.widget is NavigatorWithId) {
      // ignore: avoid_as
      if ((state.widget as NavigatorWithId).id == id) {
        return state;
      } else {
        return of(state.context, id: id);
      }
    }

    return state;
  }
}

Используйте NavigatorWithId вместо Navigator всякий раз, когда требуется, например,

return NavigatorWithId(
  id: 1,
  initialRoute: '/',
  onGenerateRoute: (_) =>
      MaterialPageRoute(builder: (_) => const YourPage()),
)

, а затем обращайтесь к нему, как:

NavigatorWithId.of(context, id: 1)

[1142 ] Решение 2:

Передайте ValueKey навигатору и создайте вспомогательную функцию, которая бы соответствовала клавише и вернула требуемый Navigator.

Функция что-то вроде

NavigatorState getNavigator(BuildContext context, {bool rootNavigator = false, ValueKey key}) {
  assert(rootNavigator != null);
  final NavigatorState state = Navigator.of(
    context,
    rootNavigator: rootNavigator,
  );
  if (rootNavigator) {
    return state;
  } else if (state.widget.key == key) {
    return state;
  }
  try {
    return getNavigator(state.context, key: key);
  } catch (e) {
    return state;
  }
}

Используйте

return Navigator(
  key: const ValueKey('Navigator1'),
  initialRoute: '/',
  onGenerateRoute: (_) =>
      MaterialPageRoute(builder: (_) => const RootPage()),
);

и получите доступ к ней, как

getNavigator(context, key: const ValueKey('Navigator1'))

Недостаток этого метода я вижу не все типы ключей будут поддерживаться.

Примечание. Я не претендую на то, чтобы какое-либо из приведенных выше решений было наилучшим или оптимальным. Это несколько методов, которые я придумал. Если кто-то может предложить лучший подход, я стремлюсь учиться:)

Надеюсь, это поможет!

35
задан imsome1 27 August 2018 в 08:04
поделиться

3 ответа

Вы пытались отформатировать весь столбец как столбец даты? Примерно так:

Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";

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

36
ответ дан 27 November 2019 в 07:14
поделиться

Попробуйте это решение в моей работе softwarew очень хорошо:

if (obj != null)
{
    if (obj is DateTime)
    {
        if (DateTime.MinValue == ((DateTime)obj))
        {

            xlWorkSheet.Cells[x,y] = String.Empty;

        }
        else
        {

            dynamic opp = ((DateTime)obj);
            xlWorkSheet.Cells[x,y] = (DateTime)opp;

        }
    }
}
0
ответ дан 27 November 2019 в 07:14
поделиться

Попробуйте использовать

DateTime.ToOADate()

И поместите это как двойное значение в ячейку. Могут возникнуть проблемы с Excel в системах Mac (он использует другое преобразование даты и времени -> двойное преобразование), но в большинстве случаев он должен работать хорошо.

Надеюсь, это поможет.

10
ответ дан 27 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

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