ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا

شاید نیاز داشته باشید که اطلاعاتی رو در سمت سرور در فایل اکسل بنویسید مثلا فاکتور خرید اینترنتی رو که به صورت پیش فرض قالب بندی شده و مواردی باید به اون اضافه بشه .در این صورت برنامه آفیس که نمیشه در سمت سرور باز کرد. یا شاید بخواهید برنامه آفیس رو برای موبایل بنویسید.

راه حل اول:

به عنوان سریع ترین راه حل بهتره از یک کتابخونه کامل مثل آپاچی POI استفاده کنید. آموزش و مستنداتش تو سایتwww.poi.apache.org  موجوده.

راه حل دوم :

خودمون دست به کار بشیم و کاپوت آفیس رو بالا بزنیم ببینیم چی به چیه. به نظر من اولین قدم جمع آوری اطلاعاته.پس به سایت مایکروسافت میریم و دنبال مستندات آفیس ۲۰۱۳ میگردیم.

در نتیجه مشخص میشود فایل های آفیس ۲۰۱۳  به عنوان یک گزینه از (open XML) برای نشان دادن نمودار ها و صفحات گسترده و نحوه نمایش صفحات و غیره در هرسه مورد  ( ورد – اکسل – پاورپوینت  ) استفاده میکند.

openXMl:

در این روش هر فایل خروجی  برای مثال اکسل (file.XLSX) در یک پوشه زیپ شده است که از چند فایل XML تشکیل شده است.

پس برای کار کردن با این فایل ها به سه چیز نیاز داریم:

۱- کتابخونه ای برای کار کردن با فایل های زیپ (زیپ و آنزیپ کردن) که برای جاوا و تقریبا هر زبانی موجوده

۲- کتابخونه ای برای کار کردن با فایل های XML (میتونیم از امکانات پایه جاوا استفاده کنیم اما اگر فایل خیلی بزرگ باشه بهتره از یک روش بهینه تر استفاده کنیم )

۳- مستنداتی که تو سایت مایکروسافت موجوده (البته ساختارش بسیار سادست بهتره یکی از فایل ها رو آنزیپ و برسی اش کنید)

 

 

مطالب غیر مرتبط:

تولید عدد صحیح تصادفی در یک بازه در جاوا (+).

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils.

کوچک تر شدن فایل بعد از کپی با استفاده از apache IO و CopyUtils

 

وقتی سعی داشتم با ابزار کپی کتاب خونه Apache IO فایلی رو از جایی به جای دیگه کپی کنم متوجه شدم فایل مقصد با فایل منبع مطابقت نداره و کمی کوچکترشده است (در حد چند ده کیلوبایت).

    • اولا باید در نظر داشته باشید که بر طبق امضای این متد باید آرگمان ها از نوع  InputStream  و OutputStream  باشند:
CopyUtils.copy(InputStream input ,OutputStream output);
    • دوما باید به سلسله مراتب کلاس های ارث برده از in/outputStream توجه کنید. در حالی که کلاس FileInputStream کلاس InputStream رو گسترش داده و در ضمن BufferedInputStream کلاس FilterInputStream گسترش میده و کلاس FilterInputStream کلاس InputStream گسترش میده پس :
FileInputStream instanceof InputStream  = true
BufferedInputStream instanceof InputStream  = true

و با توجه به تفاوت هایی که در پیاده سازی متد های read() و write() در کلاس های bufferedInputStream و FileInputStream وجود داره اگر یک نمونه از کلاس bufferedInputStream رو به عنوان آرگومان ورودی به متد Copy بدهیم فایل مقصد از فایل منبع کوچک تر خواهد شد. پس در این حالت بهتره از FileInputStream استفاده کنیم.

 

لینک های مرتبط به مطلب:

Commons IO (+).

مطالب غیر مرتبط:

ویرایش و ایجاد فایل های مایکروسافت آفیس (ورد-اکسل-پاروپوینت) در جاوا (+).

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی.

تعیین زوج و فرد یک عدد با استفاده از عملیات بیتی

برای این کار روش های مختلفی وجود دارد مثلا با استفاده از

۱-عملگر باقی مانده ی تقسیم (%):

همون طور که در ریاضیات عددی زوج است که باقی مانده ی تقسیم اش بر دو ، صفر باشد. پس به عنوان یک روش با استفاده از % زوج بودن عددی را تعیین میکنیم.

boolean is_even = (n % 2 == 0);

۲-تعیین زوج و فرد با استفاده از عملیات بیتی و عملگر بیتی &:

برای این کار ما به آخرین رقم از مقدار باینری عدد نیاز داریم که با and کردن آن با یک به دست می آید. به این صورت:اگر حاصل یک باشد، عدد فرد است و اگر صفر باشد، عدد زوج است.

number & 1

برای مثال :

۱-پنج فرد است پس:

۰۰۰۰ ۰۱۰۱ & 0000 0001 = 0000 0001

۲- و شش زوج است:

۰۰۰۰ ۰۱۱۰ & 0000 0001 = 0000 0000

و نمونه کد جاوا :

if( (number&1) == 0){
      system.out.println("even");
   }else{
        system.out.println("odd");
      }

در زیر کاپوت :

همان طور که میدانید عملگر منطقی and (&) دو مقدار دودویی با طول مساوی دریافت کرده و بر روی هر جفت بیت متناظر، عملیات عطف منطقی را انجام می‌دهد. نتیجه وقتی ۱ می‌شود که اولین بیت و دومین بیت هر دو با هم ۱ باشند، در غیر این صورت صفر خواهد بود.

جدول زیر را در نظر بگیرید:

۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹
۱ ۲ ۴ ۸ ۱۶ ۳۲ ۶۴ ۱۲۸ ۲۵۶ ۵۱۲

دو به توان هر عدد صحیح غیر منفی و صفر ، همیشه زوج خواهد بود. (نمی دونم صفر مثبته یا منفی؟)

کمترین ارزش را سمت راست ترین رقم خواهد داشت. و مقدار آن در صورت صحیح بودن یک خواهد بود.

عدد یک در مبنای دو برابر با یک است و به سمت چپ تمامی ارقام صفر خواهند بود و این هیچ تاثیری بر ارزش عدد ندارد. (۰۰۰۰۰۰۰۱) .

هر عدد فردی یک عدد زوج به علاوه یک است. پس اگر کم ارزش ترین رقم در مبنای دو صحیح باشد و دارای مقدار یک ، عدد فرد خواهد بود و در غیر این صورت عدد زوج است.

به عبارتی دیگر عطف منطقی با عدد یک، باعث میشود تمام ارقام عدد مورد آزمایش به غیر از آخرین رقم صفر شود و اگر رقم آخر یک باشد نتیجه یک می شود و فرد بودن عدد مورد آزمایش را نتیجه میدهد.

 

 

 

 

مطالب غیر مرتبط:

restart برنامه نوشته شده با جاوا (+).

 

لود کردن کتابخانه ی native از فایل jar

لود کردن کتابخانه ی native از فایل jar:

برای لود کردن کتابخانه های بومی (natvie) از فایل jar ، کافیه فایل های dll یا so رو در یک پکیج مثل سورس جاوا کپی کنید و از این کلاس استفاده کنید:


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Class NativeUtils is published under the The MIT License:
*
* Copyright (c) 2012 Adam Heinrich <adam@adamh.cz>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
import java.io.*;

/**
* A simple library class which helps with loading dynamic libraries stored in
* the JAR archive. These libraries usualy contain implementation of some
* methods in native code (using JNI - Java Native Interface).
*
* @see
* http://adamheinrich.com/blog/2012/how-to-load-native-jni-library-from-jar
* @see https://github.com/adamheinrich/native-utils
*
*/
public class NativeUtils {

	/**
* Private constructor - this class will never be instanced
*/
	private NativeUtils() {}

	/**
* Loads library from current JAR archive
*
* The file from JAR is copied into system temporary directory and then
* loaded. The temporary file is deleted after exiting. Method uses String
* as filename because the pathname is "abstract", not system-dependent.
*
* @param path The path of file inside JAR as absolute path (beginning and
* ends with '/')
* @param libname name of lib to load from jar without extension
* @throws IOException If temporary file creation or read/write operation
* fails
* @throws IllegalArgumentException If source file (param path) does not
* exist
* @throws IllegalArgumentException If the path is not absolute or if the
* filename is shorter than three characters (restriction of {
* @see File#createTempFile(java.lang.String, java.lang.String)}).
*/
	public static void loadLibraryFromJar(String path, String libName) throws IOException {

		if (!path.startsWith("/")) {
			throw new IllegalArgumentException("The path has to be absolute (start with '/').");
		} else if (!path.endsWith("/")) {
			throw new IllegalArgumentException("The path has to be end with '/'.");
		}

		//Host platform dependent library name.extension
		path += System.mapLibraryName(libName);
		System.out.println(path);

		// Obtain filename from path
		String[] parts = path.split("/");
		String filename = (parts.length & gt; 1) ? parts[parts.length - 1] : null;

		// Split filename to prexif and suffix (extension)
		String prefix = "";
		String suffix = null;
		if (filename != null) {
			parts = filename.split("\\.", 2);
			prefix = parts[0];
			suffix = (parts.length & gt; 1) ? "." + parts[parts.length - 1] : null; // Thanks, davs! 🙂
		}

		// Check if the filename is okay
		if (filename == null || prefix.length() & lt; 3) {
			throw new IllegalArgumentException("The filename has to be at least 3 characters long.");
		}

		// Prepare temporary file
		File temp = File.createTempFile(prefix, suffix);
		temp.deleteOnExit();

		if (!temp.exists()) {
			throw new FileNotFoundException("File " + temp.getAbsolutePath() + " does not exist.");
		}

		// Prepare buffer for data copying
		byte[] buffer = new byte[1024];
		int readBytes;

		// Open and check input stream
		InputStream is = NativeUtils.class.getResourceAsStream(path);
		if (is == null) {
			throw new FileNotFoundException("File " + path + " was not found inside JAR.");
		}

		// Open output stream and copy data between source file in JAR and the temporary file
		OutputStream os = new FileOutputStream(temp);
		try {
			while ((readBytes = is.read(buffer)) != -1) {
				os.write(buffer, 0, readBytes);
			}
		} finally {
			// If read/write fails, close streams safely before throwing an exception
			os.close();
			is.close();
		}

		// Finally, load the library
		System.load(temp.getAbsolutePath());
	}
}

https://github.com/RayanFar/native-utils

لود کردن کتابخانه ی native از فایل jar