我需要我的Ionic应用程序才能运行特定的xlsx文件

时间:2015-10-30 09:48:09

标签: android angularjs ionic-framework ionic xlsx

你好Stackverflow的人!

我正在开发一个小型Android应用,其目的是读取.xlsx文件并以特定形式显示其数据(条形图/圆环图)。因为我没有时间学习Java和Android所需的一切我使用Cordova&离子框架来做到这一点。我对这些很新(对于AngularJS来说也很新)但是我以前用JavaScript编码,并且已经用NodeJS编码。

到目前为止,我已设法创建一个简单的视图,使用Highcharts library读取并显示我创建并直接存储在我的Javascript / Angular代码中的虚拟数据。但现在我想使用我得到的真实数据,但却遇到了两个主要问题:

  • 首先,我的Ionic应用程序将使用的文件不是直接存储在Android设备文件系统上的文件,而是由用户在其邮箱上接收的文件。我不明白如何配置intent-filter,因此我的应用程序被检测为能够打开这些文件(以便用户在尝试从他的邮箱中打开.xlsx文件时可以选择它)。
  • 其次,当用户选择我的应用程序打开xlsx文件时,如何设法在我的JS代码中检索文件?请注意,我已经发现the library我将使用JSON格式从我的.xlsx文件中提取信息,并且已经知道如何处理这些数据。

如果您需要更多信息,我会更新此主题。

2 个答案:

答案 0 :(得分:1)

  1. 将Intent过滤器与您的MainActivity一起使用(cordova只有1个活动顺便提一下)
  2. <activity android:name="com.example.app.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="file" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.xlsx" />
            <data android:host="*" />
        </intent-filter> 
    </activity>
    

    在您的主要活动中,在onCreate中添加处理程序:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.main);
    
        // Get the intent that started this activity
        Intent intent = getIntent();
    
        if (intent != null){
           Uri data = intent.getData(); //get the uri of your xlsx
        }
        .
        . // your cordova code
        .
        .
    }
    
    1. 我认为您需要一个数据库来存储您的数据。但是,如果您可以针对该问题制作自己的CordovaPlugin,那么您可以更快地将数据从原生数据传输到网络视图。如果您选择使用数据库,那么this plugin可能会帮助您

答案 1 :(得分:0)

我设法回答了我自己的问题,部分归功于Randyka Yudhistira的第一个问题。

首先,为了检测您的应用是否能够打开XLSX文件,您必须编辑其AndroidManifest.xml。在Ionic应用程序中,此文件位于:YOUR_APP/platforms/android/AndroidManifest.xml。在<activity>部分中添加以下intent-filter(再次感谢Randyka Yudhistira):

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="file" />
    <data android:mimeType="*/*" />
    <data android:pathPattern=".*\\.xlsx" />
    <data android:host="*" />
</intent-filter>

其次,要打开并阅读XLSX文件并从中提取数据,您需要使用Bower轻松安装的ngCordova plugin,以及名为File的WebIntent Android plugin for Cordova和ngCorodva插件:

bower install ngCordova
cordova plugin add https://github.com/Initsogar/cordova-webintent.git
cordova plugin add org.apache.cordova.file

在HTML文件中引用ngCordova(在引用cordova lib之前):

<script src="lib/ngCordova/dist/ng-cordova.js"></script>
<script src="cordova.js"></script>

并将其作为角度模块中的Angular依赖项注入:

var yourApp = angular.module("yourApp", ['ionic', 'ngCordova']);

如果您需要使用给定文件“提供”应用,例如在我的应用中,您需要检索文件的网址。为此,请在您的Ionic控制器中添加服务$cordovaFile$ionicPlatform,并使用以下webintent插件获取文件的URI:

yourApp.controller('yourAppController', function($scope, $ionicPlatform, $cordovaFile) {
  $ionicPlatform.ready(function() {
    if (window.plugins && window.plugins.webintent) { // checks if plugins are enabled and loaded
      window.plugins.webintent.getUri(function (url) {
        if(url) {
          // use your file URL here
        }
      }
    }
  });
}

要打开文件并读取其数据,您需要将文件路径与文件名分开:

var path = url.slice(0, url.lastIndexOf('/') + 1);
var filename = url.substring(url.lastIndexOf('/') + 1);

最后,您可以使用cordova File plugin以四种不同的方式(如Text,DataURL,BinaryString,ArrayBuffer)读取文件中的数据,使用函数cordovaFile.readAs<theWayYouWant>(path, file)(您得到一个{ {3}});例如,我需要将数据作为二进制字符串:

$cordovaFile.readAsBinaryString(path, filename)
  .then(function(result) { // success
    ...
  }, function() { // failure
    alert('failed to open file');
});

希望这个答案可以帮助那些像我一样努力打开并阅读Ionic App中文件数据的人: - )