做Excel声明循环代码

时间:2017-01-08 18:09:35

标签: vb.net

我有很大的excel文件需要很长时间才能打开。

我想在文件准备好后立即声明xlApp而不会出错。

以下代码需要修复。

// Based on slide 88+ in https://speakerdeck.com/mpilquist/scalaz-state-monad
// Adjusted for Scala 2.11 (invariant A), Scalaz 7.2 (Pointed->Applicative) and Throwable on lhs of Either
object IntegratingStateAndEither {
  import scalaz._
  import scalaz.Scalaz._
  import EitherT._
  import scalaz.StateT.stateMonad

  type QueryStateS[A] = State[QueryState, A]
  type ET[F[_], A] = EitherT[F, Throwable, A]
  type QueryStateES[A] = ET[QueryStateS, A]

  object QueryStateES {
    def apply[A](s: QueryStateS[Throwable \/ A]): QueryStateES[A] = EitherT(s)
    def liftE[A](e: Throwable \/ A): QueryStateES[A] = apply(Applicative[QueryStateS].point(e))
    def liftS[A](s: QueryStateS[A]): QueryStateES[A] = MonadTrans[ET].liftM(s)
  }

  def runQuery(s: String, m: Model): QueryStateES[QueryResult] = for {
    query <- parseQuery(s)
    res <- performQuery(query, m)
  } yield res

  def parseQuery(s: String): QueryStateES[StatsQuery] =
    QueryStateES.liftE(new Exception("TODO parse").left)

  def performQuery(q: StatsQuery, m: Model): QueryStateES[QueryResult] =
    QueryStateES.liftE(new Exception("TODO perform").left)

  // Just examples that do nothing
  case class Model()
  case class StatsQuery()
  case class QueryResult()
  case class QueryState()

  def test = runQuery("a + b", Model()).run.run(QueryState())
}

如果我在没有打开Book1的情况下运行以下行,则后续行会出错。

Process.Start("C:\Book1.xlsx")
Do While SOMETHING
   Application.DoEvents()
Loop
Dim xlApp As Excel.Application = Nothing
xlApp = CType(GetObject(Nothing, "Excel.Application"), Excel.Application)

使用以下代码并不是一个好主意,因为Book1.xlsx的开放时间总是不同。

xlApp = CType(GetObject(Nothing, "Excel.Application"), Excel.Application)

1 个答案:

答案 0 :(得分:3)

如果文件需要很长时间才能打开,那么你只需要等待。但是,如果这是一个选项,你还可以做其他事情。

首先打开文件,使用:

Microsoft.Office.Interop.Excel.Application excel = new Application();
Microsoft.Office.Interop.Excel.Workbook workBook =
    excel.Workbooks.Open(fileLocation);

为此你只需要等待,但是应用程序已经创建,所以只要文件准备就绪就可以了。

如果文件打开时间过长,您可以将文件转换为CSV并保存。然后,您可以随时阅读该文件,并且可以非常快速地阅读。这可能不是一个选择,但如果是,那么这里是如何:

workBook.SaveAs(
    fileLocation + ".csv",
    Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows
);
workBook.Close(true);
excel.Quit();

然后你可以使用File.ReadLines()方法快速阅读它。该方法将一次读取一行,因此它不会尝试加载整个文件而只是一行,您可以立即开始阅读。当你阅读更多行时,它会继续将它们读入内存:

foreach (var thisLine in File.ReadLines(fileLocation))
{
    // do something
}