我有很大的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)
答案 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
}