如何使用Objective-C在UIWebView IOS中打开file.xlsx文件

7

我在我的IOS应用程序文档文件夹中有一个file.xlsx文件。我想在UIWebview中打开此excel文件,但是我遇到了以下错误:

Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted" 

但是PDF和CSV文件可以打开,我是IOS新手,在过去的两天里尝试了所有可能的方法使它能够工作,但似乎没有任何效果……请帮帮我。

更新: 即使我将其重命名为file.xls,它也无法打开。 以下是我的代码:

    NSURL* nsUrl = [NSURL URLWithString:url];
        _urlReq = [NSURL URLWithString:url];
        [self performSelector:@selector(urlRequestForFile) withObject:nil afterDelay:0];
        _webView.delegate = self;
        NSURLRequest* request = [NSURLRequest requestWithURL: nsUrl];
        [_webView loadRequest: request];

-(void)urlRequestForFile{
    self.connection = nil;
    NSURLRequest *requestForFile = [NSURLRequest requestWithURL:_urlReq cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:300];
    _connection = [[NSURLConnection alloc]initWithRequest:requestForFile delegate:self startImmediately:YES];
    _ongingServiceFlag = YES;

}

需要帮助在我的IOS应用程序中显示xlsx文件,无论是使用UIWebView还是其他方法,在不使用第三方应用程序的情况下显示xlsx文件?
更新(解决方案): 我很惊讶地看到甚至连苹果网站上也没有提到UIWebView支持XLSX,但实际上UIWebView完全支持XLSX格式。你需要确保指定正确的"textEncodingName"值。如果您的文件以base64二进制编码存储,请将其指定为textEncodingName:@“base64”,否则您必须指定为“utf-8”。
以下行适用于我:
[webView loadData:urlData MIMEType:@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" textEncodingName:@"base64" baseURL:nil];

1
你可能更喜欢使用 QLPreviewController - rmaddy
并更新您的问题与相关代码,以便其他人可以帮助您修复它。 - rmaddy
2
FYI - xls和xlsx是两种完全不同的文件格式。仅仅将其中一个重命名为另一个并不能改变文件的格式。 - rmaddy
@rmaddy..我对QLPreviewController毫无头绪。您有任何参考链接可以展示如何使用它吗? - kumar
你能找到一个对你有用的答案吗? - Chris J
请检查此链接:https://github.com/renebigot/XlsxReaderWriter - Pulkit Kumar Singh
3个回答

3

嗨Ganesh,非常感谢您的回复。我想知道除了QLPreviewController之外,在iOS应用程序中显示xlsx文件是否有其他方法? - kumar

2

.xlsx文件无法使用UIWebView打开。虽然您可以使用UIWebView加载.xls文件。

以下是可以使用UIWebView加载的文件列表:

https://developer.apple.com/library/content/qa/qa1630/_index.html

如果您想使用.xlsx文件,则必须使用包含QLPreviewControllerQuickLook FrameWork。您的代码应该像这样 -

  - (void) initQlController{
  QLPreviewController *prev = [[QLPreviewController alloc]init];
  prev.delegate = self;
  prev.dataSource = self;
  [self presentModalViewController:prev animated:YES];
  [prev.navigationItem setRightBarButtonItem:nil]; }

然后您需要使用dataSource方法完成相同的操作:-
- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller

2
.XLSX文件类型基于openXML,这是个好消息!这意味着它很容易被读取,我们只需要让webview知道我们正在加载/显示的文件类型,或者更确切地说是mimeTYPE。根据微软的说法,用于XLSX(OpenXML)文件的mimetype是:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
来源:https://blogs.msdn.microsoft.com/dmahugh/2006/08/08/content-types-for-open-xml-documents/ 为了实现这一点,我们通过调用webView方法来加载数据(dataWithContentsOfFile:或dataWithContentsOfURL:或您喜欢的方法)。
[_webView loadData:<#(nonnull NSData *)#> MIMEType:<#(nonnull NSString *)#> textEncodingName:<#(nonnull NSString *)#> baseURL:<#(nonnull NSURL *)#>]

我工作代码的示例:

我的工作代码示例:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://mycoolserver.com/file.xlsx"]];
[_webView loadData:data MIMEType:@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" textEncodingName:@"utf-8" baseURL:nil];

Side-by-side comparison of origional file and webview rendered file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接